﻿Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX
Imports Commander_Wars.Spieletools
<Serializable()> Public Class Objektverwalter
#Region "Variablen"
    Enum ABC
        A
        B
        C
        D
        E
        F
        G
        H
        I
        J
        K
        L
        M
        N
        O
        P
        Q
        R
        S
        T
        U
        V
        W
        X
        Y
        Z
    End Enum
    <NonSerialized()> Private Shared Frames As Integer
    Public Shared Property FrameMarkierteFelder() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames > 1 Then
                Frames = 0
            End If
        End Set
    End Property
    Public Shared AutospeicherIndex As Integer = 0

#Region "Texturen"
    ''' <summary>
    ''' Texturvom Bild
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Shared texturHintergrungBild As Texture
    ''' <summary>
    ''' Texturvom Bild
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Shared texturVordergrundBild As Texture
    <NonSerialized()> Public Shared LandschaftenBilder() As ObjektLandschaftsTextur = {}
    <NonSerialized()> Public Shared Pfeile() As Texture = {}
    <NonSerialized()> Public Shared Symbole() As Texture = {}
    <NonSerialized()> Public Shared Symbolfunktion() As String = {}
    <NonSerialized()> Public Shared KOS() As KO = {}
    <NonSerialized()> Public Shared CustomKOS() As KOCustom = {}
    <NonSerialized()> Public Shared ABCBild As Texture
    <NonSerialized()> Public Shared TagzuTagAnzeige() As Texture = {}
    <NonSerialized()> Public Shared TagzuTagArmee() As String = {}
    Structure KO
        Public Sub New(ByVal Textur As Direct3D.Texture, ByVal ID As String, ByVal neuArmy As String, ByVal Beschreibunge As ObjektKOBeschreibung)
            KOTexture = Textur
            KOIDE = ID
            ARMY = neuArmy
            Beschreibung = Beschreibunge
        End Sub
        Private KOTexture As Direct3D.Texture
        Public ReadOnly Property KOTextur() As Direct3D.Texture
            Get
                Return KOTexture
            End Get
        End Property
        Private KOIDE As String
        Public ReadOnly Property KOID() As String
            Get
                Return KOIDE
            End Get
        End Property
        Private ARMY As String
        Public ReadOnly Property Armee() As String
            Get
                Return ARMY
            End Get
        End Property
        Private Beschreibung As ObjektKOBeschreibung
        Public ReadOnly Property KOBeschreibung() As ObjektKOBeschreibung
            Get
                Return Beschreibung
            End Get
        End Property
    End Structure
#Region "Einheiten und Gebäude Texturen und so"
#Region "Einheiten"
    ''' <summary>
    ''' KampfanimationsTexturen der Einheiten werden hier gespeichert!
    ''' </summary>
    ''' <remarks></remarks>
    Structure Kampfanimation
        Implements ICloneable
        Public EinheitenID As String
        Public Bewegungstextur As Texture
        Public BewegungstexturMaske As Texture
        Public KampfanimationWaffe1 As Texture
        Public KampfanimationWaffe1Maske As Texture
        Public KampfanimationWaffe2 As Texture
        Public KampfanimationWaffe2Maske As Texture
        Public MovementFrames As Integer
        Public Stoppingframes As Integer
        Public Firingframes1 As Integer
        Public Firingframes2 As Integer
        Public Bildgröße As Size
        Public Truppenzahl As Integer
        Public EinzelUnitPosition As Point
        Dim ArmeeID As String
        Public Sub New(ByVal EinheitenID As String, ByVal Bildgröße As Size, ByVal Armee As String, ByVal Movingframes As Integer, ByVal Stoppingframes As Integer, ByVal Einheitenzahl As Integer, ByVal EinzelUnitPosition As Point, Optional ByRef Existiert As Integer = 6)
            Me.ArmeeID = Armee
            Me.EinheitenID = EinheitenID
            Me.Bildgröße = Bildgröße
            Me.MovementFrames = Movingframes
            Me.Stoppingframes = Stoppingframes
            Me.EinzelUnitPosition = EinzelUnitPosition
            Me.Truppenzahl = Einheitenzahl
            Dim Pfad As String = My.Settings.Resourcenpfad + "Einheiten\KampfAnimationen\" + EinheitenID + "\" + EinheitenID
            If Armee = "" Then
                If My.Computer.FileSystem.FileExists(Pfad + "+Laufen.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+Laufen.png")
                    Bewegungstextur = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+Laufen+Maske.png")
                    BewegungstexturMaske = Grafikengine.LoadTexture(B)
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+Waffe1.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+Waffe1.png")
                    KampfanimationWaffe1 = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+Waffe1+Maske.png")
                    KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)

                    Firingframes1 = B.Width / Bildgröße.Width - 1
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+Waffe2.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+Waffe2.png")
                    KampfanimationWaffe2 = Grafikengine.LoadTexture(B)
                    Firingframes2 = B.Width / Bildgröße.Width - 1
                    B = Image.FromFile(Pfad + "+Waffe2+Maske.png")
                    KampfanimationWaffe2Maske = Grafikengine.LoadTexture(B)
                End If
                If Bewegungstextur Is Nothing Then
                    If My.Computer.FileSystem.FileExists(Pfad + ".png") Then
                        Dim B As Image = Image.FromFile(Pfad + ".png")
                        Bewegungstextur = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+Maske.png")
                        BewegungstexturMaske = Grafikengine.LoadTexture(B)
                    End If
                End If
                If KampfanimationWaffe1 Is Nothing Then
                    If My.Computer.FileSystem.FileExists(Pfad + ".png") Then
                        Dim B As Image = Image.FromFile(Pfad + ".png")
                        KampfanimationWaffe1 = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+Maske.png")
                        KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)
                    End If
                End If
                If KampfanimationWaffe2 Is Nothing Then
                    If My.Computer.FileSystem.FileExists(Pfad + ".png") Then
                        Dim B As Image = Image.FromFile(Pfad + ".png")
                        KampfanimationWaffe2 = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+Maske.png")
                        KampfanimationWaffe2Maske = Grafikengine.LoadTexture(B)
                    End If
                End If
            Else
                If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + "+Laufen.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+" + Armee + "+Laufen.png")
                    Bewegungstextur = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+" + Armee + "+Laufen+Maske.png")
                    BewegungstexturMaske = Grafikengine.LoadTexture(B)
                Else
                    Existiert -= 1
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + "+Waffe1.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+" + Armee + "+Waffe1.png")
                    KampfanimationWaffe1 = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+" + Armee + "+Waffe1+Maske.png")
                    KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)
                    Firingframes1 = B.Width / Bildgröße.Width - 1
                Else
                    Existiert -= 1
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + "+Waffe2.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+" + Armee + "+Waffe2.png")
                    KampfanimationWaffe2 = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+" + Armee + "+Waffe2+Maske.png")
                    KampfanimationWaffe2Maske = Grafikengine.LoadTexture(B)
                    Firingframes2 = B.Width / Bildgröße.Width - 1
                Else
                    Existiert -= 1
                End If
                If Existiert > 0 Then
                    If Bewegungstextur Is Nothing Then
                        If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+" + Armee + ".png")
                            Bewegungstextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+" + Armee + "+Maske.png")
                            BewegungstexturMaske = Grafikengine.LoadTexture(B)
                        ElseIf My.Computer.FileSystem.FileExists(Pfad + "+OS.png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+OS.png")
                            Bewegungstextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+OS+Maske.png")
                            BewegungstexturMaske = Grafikengine.LoadTexture(B)
                        End If
                    End If
                    If KampfanimationWaffe1 Is Nothing Then
                        If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+" + Armee + ".png")
                            KampfanimationWaffe1 = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+" + Armee + "+Maske.png")
                            KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)
                            Firingframes1 = B.Width / Bildgröße.Width - 1
                        ElseIf My.Computer.FileSystem.FileExists(Pfad + "+OS.png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+OS.png")
                            KampfanimationWaffe1 = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+OS+Maske.png")
                            KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)
                            Firingframes1 = B.Width / Bildgröße.Width - 1
                        End If
                    End If
                    If KampfanimationWaffe2 Is Nothing Then
                        If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+" + Armee + ".png")
                            KampfanimationWaffe2 = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+" + Armee + "+Maske.png")
                            KampfanimationWaffe2Maske = Grafikengine.LoadTexture(B)
                            Firingframes2 = B.Width / Bildgröße.Width - 1
                        ElseIf My.Computer.FileSystem.FileExists(Pfad + "+OS.png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+OS.png")
                            KampfanimationWaffe2 = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+OS+Maske.png")
                            KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)
                            Firingframes2 = B.Width / Bildgröße.Width - 1
                        End If
                    End If

                    'Falls wir wenigstens eine Textur gefunden haben werden leere Texturen damit gefüllt
                    If Not Bewegungstextur Is Nothing Then
                        If KampfanimationWaffe1 Is Nothing Then
                            KampfanimationWaffe1 = Bewegungstextur
                            KampfanimationWaffe1Maske = BewegungstexturMaske
                        End If
                        If KampfanimationWaffe2 Is Nothing Then
                            KampfanimationWaffe2 = Bewegungstextur
                            KampfanimationWaffe2Maske = BewegungstexturMaske
                        End If
                    End If
                    If Not KampfanimationWaffe1 Is Nothing Then
                        If Bewegungstextur Is Nothing Then
                            Bewegungstextur = KampfanimationWaffe1
                            BewegungstexturMaske = KampfanimationWaffe1Maske
                        End If
                        If KampfanimationWaffe2 Is Nothing Then
                            KampfanimationWaffe2 = KampfanimationWaffe1
                            KampfanimationWaffe2Maske = KampfanimationWaffe1Maske
                        End If
                    End If
                    If Not KampfanimationWaffe2 Is Nothing Then
                        If Bewegungstextur Is Nothing Then
                            Bewegungstextur = KampfanimationWaffe2
                            BewegungstexturMaske = KampfanimationWaffe2Maske
                        End If
                        If KampfanimationWaffe1 Is Nothing Then
                            KampfanimationWaffe1 = KampfanimationWaffe2
                            KampfanimationWaffe1Maske = KampfanimationWaffe2Maske
                        End If
                    End If
                    'Default laden
                    Pfad = My.Settings.Resourcenpfad + "Einheiten\KampfAnimationen\KPZ\KPZ"
                    If Bewegungstextur Is Nothing Then
                        Dim B As Image = Image.FromFile(Pfad + "+OS+Laufen.png")
                        Bewegungstextur = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+OS+Laufen+Maske.png")
                        BewegungstexturMaske = Grafikengine.LoadTexture(B)
                    End If
                    If KampfanimationWaffe1 Is Nothing Then
                        Dim B As Image = Image.FromFile(Pfad + "+OS+Waffe1.png")
                        KampfanimationWaffe1 = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+OS+Waffe1+Maske.png")
                        KampfanimationWaffe1Maske = Grafikengine.LoadTexture(B)
                        Firingframes1 = B.Width / Bildgröße.Width - 1
                    End If
                    If KampfanimationWaffe2 Is Nothing Then
                        Dim B As Image = Image.FromFile(Pfad + "+OS+Waffe2.png")
                        KampfanimationWaffe2 = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+OS+Waffe2+Maske.png")
                        KampfanimationWaffe2Maske = Grafikengine.LoadTexture(B)
                        Firingframes1 = B.Width / Bildgröße.Width - 1
                    End If
                End If
            End If
        End Sub
        ''' <summary>
        ''' eine Flache Kopie
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Clone() As Object Implements System.ICloneable.Clone
            Dim K As Kampfanimation = MemberwiseClone()
            K.EinzelUnitPosition = New Point(EinzelUnitPosition.X, EinzelUnitPosition.Y)
            Return K
        End Function
        Public Sub Dispose()
            If Bewegungstextur IsNot Nothing Then
                Bewegungstextur.Dispose()
            End If
            If BewegungstexturMaske IsNot Nothing Then
                BewegungstexturMaske.Dispose()
            End If
            If KampfanimationWaffe1 IsNot Nothing Then
                KampfanimationWaffe1.Dispose()
            End If
            If KampfanimationWaffe1Maske IsNot Nothing Then
                KampfanimationWaffe1Maske.Dispose()
            End If
            If KampfanimationWaffe2 IsNot Nothing Then
                KampfanimationWaffe2.Dispose()
            End If
            If KampfanimationWaffe2Maske IsNot Nothing Then
                KampfanimationWaffe2Maske.Dispose()
            End If
        End Sub
    End Structure
    Public Structure EinheitenTextur
        Enum ArmeeEinheiten
            Alles
            NurKampfSprite
            Nichts
        End Enum
        Dim Kampfanimationen As Stack(Of Kampfanimation)
        Dim EinheitenID As String
        Dim Einheitentexturen() As Texture
        Dim EinheitentexturenMaske() As Texture
        Dim ETexturArmee As String()
        Dim Lauftextur() As Texture
        Dim LauftexturMaske() As Texture
        Dim LTexturArmee() As String
        Dim Bildgröße() As Size
        Dim Einheit As ObjektEinheit
        Dim ArmeeEinheit As ArmeeEinheiten
        Public Sub New(ByVal EinheitenID As String)
            ArmeeEinheit = ArmeeEinheiten.Alles
            Me.Einheit = ObjektLadeklasse.NewEinheit(EinheitenID, -1, -1, -1)
            Me.EinheitenID = Einheit.EinheitenID
            LoadTexturen()
        End Sub
        Public Sub New(ByVal Einheiten As ObjektEinheit)
            ArmeeEinheit = ArmeeEinheiten.Nichts
            Me.Einheit = Einheiten
            Me.EinheitenID = Einheiten.EinheitenID
            LoadTexturen()
        End Sub
        Private Sub LoadTexturen()
            Kampfanimationen = New Stack(Of Kampfanimation)
            ArmeeEinheit = ArmeeEinheiten.NurKampfSprite
            Select Case Einheit.EinheitenID
                Case "ABPZ"
                    PanzerBildLaden("Amphibienpanzer", "ABPZ")
                    Kampfanimationen.Push(New Kampfanimation("ABPZ", New Size(100, 70), "", 0, 0, 5, New Point(0, 0))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "ART"
                    PanzerBildLaden("Artillerie", "ART")
                Case "AUFKLÄRER"
                    PanzerBildLaden("Aufklärer", "AUFKLÄRER")
                    Kampfanimationen.Push(New Kampfanimation("AUFKLÄRER", New Size(100, 70), "", 0, 0, 5, New Point(0, -40)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "BOMBER"
                    PanzerBildLaden("Bomber", "BOMBER")
                Case "FLAK"
                    PanzerBildLaden("Flak", "FLAK")
                Case "FLTR"
                    PanzerBildLaden("Flugzeugträger", "FLTR")
                    Kampfanimationen.Push(New Kampfanimation("FLTR", New Size(96, 83), "", 0, 0, 1, New Point(0, 100)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case MovementSorts.HÖLLIUM.tostring.toupper
                    PanzerBildLaden(MovementSorts.Höllium.tostring, MovementSorts.HÖLLIUM.tostring.toupper)
                    Kampfanimationen.Push(New Kampfanimation(MovementSorts.HÖLLIUM.tostring.toupper, New Size(104, 68), "", 0, 0, 1, New Point(11, 87))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "HOVERCRAFT"
                    PanzerBildLaden("Hovercraft", "HOVERCRAFT")
                    Kampfanimationen.Push(New Kampfanimation("HOVERCRAFT", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "JGPZ"
                    PanzerBildLaden("Jagdpanzer", "JGPZ")
                Case "JÄGER"
                    PanzerBildLaden("Jäger", "JÄGER")
                Case "K-HELI"
                    PanzerBildLaden("K-Heli", "K-HELI")
                Case "KPZ"
                    PanzerBildLaden("Kampfpanzer", "KPZ")
                Case "KREUZER"
                    PanzerBildLaden("Kreuzer", "KREUZER")
                Case "L-BOOT"
                    PanzerBildLaden("Landeboot", "L-BOOT")
                Case "LÄUFER"
                    PanzerBildLaden(MovementSorts.Läufer.tostring, "LÄUFER")
                    Kampfanimationen.Push(New Kampfanimation("LÄUFER", New Size(66, 74), "", 0, 0, 1, New Point(31, 75))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "MEGAPZ"
                    PanzerBildLaden("Megapanzer", "MEGAPZ")
                    Kampfanimationen.Push(New Kampfanimation("MEGAPZ", New Size(108, 120), "", 0, 0, 1, New Point(8, 35)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "MISSILE"
                    PanzerBildLaden("Missile", "MISSILE")
                Case "RKW"
                    PanzerBildLaden("Raketenwerfer", "RKW")
                Case "SCHLFF"
                    PanzerBildLaden("Schlachtschiff", "SCHLFF")
                Case "S-BOMBE"
                    PanzerBildLaden("S-Bombe", "S-BOMBE")
                    Kampfanimationen.Push(New Kampfanimation("S-BOMBE", New Size(118, 80), "", 0, 0, 1, New Point(0, 4))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "S-BOOT"
                    PanzerBildLaden("S-Boot", "S-BOOT")
                    Kampfanimationen.Push(New Kampfanimation("S-BOOT", New Size(104, 73), "", 0, 0, 1, New Point(0, 119))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "SPÄHER"
                    PanzerBildLaden("Späher", "SPÄHER")
                Case "TARNK"
                    PanzerBildLaden("Tarnkappenbomber", "TARNK")
                    Kampfanimationen.Push(New Kampfanimation("TARNK", New Size(121, 60), "", 0, 0, 1, New Point(3, 40)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "TITANPZ"
                    PanzerBildLaden("Titanpanzer", "TITANPZ")
                    Kampfanimationen.Push(New Kampfanimation("TITANPZ", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "T-FLUGZEUG"
                    PanzerBildLaden("Transportflugzeug", "T-FLUGZEUG")
                    Kampfanimationen.Push(New Kampfanimation("T-FLUGZEUG", New Size(104, 91), "", 0, 0, 1, New Point(0, 2))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "T-HELI"
                    PanzerBildLaden("T-Heli", "T-HELI")
                Case "TTL"
                    PanzerBildLaden("TTLäufer", "TTL")
                    Kampfanimationen.Push(New Kampfanimation("TTL", New Size(64, 80), "", 0, 0, 1, New Point(31, 75)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "TTP"
                    PanzerBildLaden("TTP", "TTP")
                Case "U-BOOT"
                    PanzerBildLaden("U-Boot", "U-BOOT")
                Case "ZEPPELIN"
                    PanzerBildLaden("Zeppelin", "ZEPPELIN")
                    Kampfanimationen.Push(New Kampfanimation("ZEPPELIN", New Size(174, 113), "", 0, 0, 1, New Point(-47, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "ZERSTÖRER"
                    PanzerBildLaden("Zerstörer", "ZERSTÖRER")
                    Kampfanimationen.Push(New Kampfanimation("ZERSTÖRER", New Size(113, 114), "", 0, 0, 1, New Point(0, 78)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "TRITON"
                    PanzerBildLaden("Triton", "TRITON")
                    Kampfanimationen.Push(New Kampfanimation("TRITON", New Size(96, 81), "", 0, 0, 1, New Point(0, 111)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "DREADNAUGHT"
                    PanzerBildLaden("Dreadnaught", "DREADNAUGHT")
                    Kampfanimationen.Push(New Kampfanimation("DREADNAUGHT", New Size(137, 129), "", 0, 0, 1, New Point(-10, 63)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "VERSORGUNGSSCHIFF"
                    PanzerBildLaden("Versorgungsschiff", "VERSORGUNGSSCHIFF")
                    Kampfanimationen.Push(New Kampfanimation("VERSORGUNGSSCHIFF", New Size(108, 112), "", 0, 0, 1, New Point(0, 80)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "BAUPANZER"
                    PanzerBildLaden("Baupanzer", "BAUPANZER")
                    Kampfanimationen.Push(New Kampfanimation("BAUPANZER", New Size(100, 46), "", 0, 0, 1, New Point(13, 120))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "V3RAKETENWERFER"
                    PanzerBildLaden("V3-Raketenwerfer", "V3RAKETENWERFER")
                    Kampfanimationen.Push(New Kampfanimation("V3RAKETENWERFER", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "HOVERFLAK"
                    PanzerBildLaden("Hoverflak", "HOVERFLAK")
                    Kampfanimationen.Push(New Kampfanimation("HOVERFLAK", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "SCHWERESHOVERCRAFT"
                    PanzerBildLaden("Schweres Hovercraft", "SCHWERESHOVERCRAFT")
                    Kampfanimationen.Push(New Kampfanimation("SCHWERESHOVERCRAFT", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "FLARE"
                    PanzerBildLaden("Flare", "FLARE")
                Case "PANZERABWEHRKANONE"
                    PanzerBildLaden("Panzerabwehrkanone", "PANZERABWEHRKANONE")
                Case "WASSERFLUGZEUG"
                    PanzerBildLaden("Wasserflugzeug", "WASSERFLUGZEUG")
                Case "KANONENBOOT"
                    PanzerBildLaden("Kanonenboot", "KANONENBOOT")
                Case Else 'Custom Unit kein Plan wie wir das machen!
                    If TypeOf Einheit Is EinheitCustom Then
                        CustomBildLaden(EinheitenID, EinheitenID)
                        Kampfanimationen.Push(New Kampfanimation("TITANPZ", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                        ArmeeEinheit = ArmeeEinheiten.Nichts
                    Else
                        PanzerBildLaden(EinheitenID, EinheitenID)
                    End If
                   
            End Select
        End Sub
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="Spieler"></param>
        ''' <remarks></remarks>
        Public Sub LoadArmeeTexturen(ByVal Spieler() As ObjektSpieler)
            SyncLock Objektverwalter.AlleEinheiten
                If ArmeeEinheit = ArmeeEinheiten.Nichts Then Exit Sub
                Dim Armee As New Stack(Of String)
                For I = 0 To Spieler.Length - 1
                    If Spieler(I).Armee <> "" Then
                        If Not Armee.Contains(Spieler(I).Armee) Then
                            Armee.Push(Spieler(I).Armee)
                        End If
                    End If
                Next

                If ArmeeEinheit = ArmeeEinheiten.Alles Then
                    If Einheitentexturen IsNot Nothing Then
                        For I = 0 To Einheitentexturen.Length - 1
                            Einheitentexturen(I).Dispose()
                        Next
                    End If
                    Array.Resize(Einheitentexturen, 0)
                    If Lauftextur IsNot Nothing Then
                        For I = 0 To Lauftextur.Length - 1
                            Lauftextur(I).Dispose()
                        Next
                    End If
                    Array.Resize(Lauftextur, 0)
                    If EinheitentexturenMaske IsNot Nothing Then
                        For I = 0 To EinheitentexturenMaske.Length - 1
                            EinheitentexturenMaske(I).Dispose()
                        Next
                    End If
                    Array.Resize(EinheitentexturenMaske, 0)
                    If LauftexturMaske IsNot Nothing Then
                        For I = 0 To LauftexturMaske.Length - 1
                            LauftexturMaske(I).Dispose()
                        Next
                    End If
                    Array.Resize(LauftexturMaske, 0)
                End If
                If ArmeeEinheit <= ArmeeEinheiten.NurKampfSprite Then
                    If Kampfanimationen IsNot Nothing Then
                        For I = 0 To Kampfanimationen.Count - 1
                            Kampfanimationen(I).Dispose()
                        Next
                        Kampfanimationen.Clear()
                    End If
                End If
                Dim K As Kampfanimation
                Select Case Einheit.EinheitenID
                    Case "ART"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("ART", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("ART", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "BOMBER"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("BOMBER", New Size(128, 120), Armee(I), 0, 0, 1, New Point(-1, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("BOMBER", New Size(128, 120), Armeen.OS.ToString, 0, 0, 1, New Point(-1, 0)))
                        End If
                    Case "FLAK"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("FLAK", New Size(100, 70), Armee(I), 6, 4, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("FLAK", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                    Case "INF"
                        InfanterieBildLaden("Infanterie", "INF", Armee.ToArray)
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("INF", New Size(100, 70), Armee(I), 12, 0, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("INF", New Size(100, 70), Armeen.OS.ToString, 12, 0, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "JGPZ"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("JGPZ", New Size(100, 70), Armee(I), 4, 4, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("JGPZ", New Size(100, 70), Armeen.OS.ToString, 4, 4, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "JÄGER"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("JÄGER", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, -30), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("JÄGER", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, -30)))
                        End If
                    Case "K-HELI"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("K-HELI", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, -40), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("K-HELI", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, -40)))
                        End If
                    Case "KPZ"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("KPZ", New Size(100, 70), Armee(I), 4, 4, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("KPZ", New Size(100, 70), Armeen.OS.ToString, 4, 4, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "KREUZER"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("KREUZER", New Size(105, 102), Armee(I), 0, 0, 1, New Point(0, 90), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("KREUZER", New Size(105, 102), Armeen.OS.ToString, 0, 0, 1, New Point(0, 90)))
                        End If
                    Case "L-BOOT"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("L-BOOT", New Size(111, 96), Armee(I), 0, 0, 1, New Point(0, 96), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("L-BOOT", New Size(111, 96), Armeen.OS.ToString, 0, 0, 1, New Point(0, 96))) 'Fertig
                        End If
                    Case "MECH"
                        InfanterieBildLaden(MovementSorts.Mech.ToString, MovementSorts.Mech.ToString.ToUpper, Armee.ToArray)
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation(MovementSorts.Mech.ToString.ToUpper, New Size(100, 70), Armee(I), 12, 1, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation(MovementSorts.Mech.ToString.ToUpper, New Size(100, 70), Armeen.OS.ToString, 12, 1, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "MISSILE"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("MISSILE", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("MISSILE", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                    Case "RKW"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("RKW", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("RKW", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "SSIEINHEIT"
                        InfanterieBildLaden("Scharfschütze", "SSIEINHEIT", Armee.ToArray)
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("SSIEINHEIT", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("SSIEINHEIT", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                    Case "SCHLFF"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("SCHLFF", New Size(111, 128), Armee(I), 0, 0, 1, New Point(0, 64), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("SCHLFF", New Size(111, 128), Armeen.OS.ToString, 0, 0, 1, New Point(0, 64)))
                        End If
                    Case "SPÄHER"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("SPÄHER", New Size(100, 70), Armee(I), 4, 4, 5, New Point(0, 0), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("SPÄHER", New Size(100, 70), Armeen.OS.ToString, 4, 4, 5, New Point(0, 0))) 'Fertig
                        End If
                    Case "T-HELI"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("T-HELI", New Size(118, 84), Armee(I), 0, 0, 1, New Point(4, 20), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("T-HELI", New Size(118, 84), Armeen.OS.ToString, 0, 0, 1, New Point(4, 20))) 'Fertig
                        End If
                    Case "TTP"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("TTP", New Size(100, 75), Armee(I), 0, 0, 1, New Point(13, 80), E) 'Fertig
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("TTP", New Size(100, 75), Armeen.OS.ToString, 0, 0, 1, New Point(13, 80))) 'Fertig
                        End If
                    Case "U-BOOT"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("U-BOOT", New Size(93, 80), Armee(I), 0, 0, 1, New Point(0, 112), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("U-BOOT", New Size(93, 80), Armeen.OS.ToString, 0, 0, 1, New Point(0, 112)))
                        End If
                    Case "MOTORRAD"
                        InfanterieBildLaden("Motorrad", "MOTORRAD", Armee.ToArray)
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("MOTORRAD", New Size(54, 40), Armee(I), 0, 0, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("MOTORRAD", New Size(54, 40), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                    Case "FLARE"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("FLARE", New Size(58, 44), Armee(I), 0, 0, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("FLARE", New Size(58, 44), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                    Case "PANZERABWEHRKANONE"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("PANZERABWEHRKANONE", New Size(68, 45), Armee(I), 0, 0, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("PANZERABWEHRKANONE", New Size(68, 45), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                    Case "WASSERFLUGZEUG"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("WASSERFLUGZEUG", New Size(57, 39), Armee(I), 0, 0, 5, New Point(0, -40), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("WASSERFLUGZEUG", New Size(57, 39), Armeen.OS.ToString, 0, 0, 5, New Point(0, -40)))
                        End If
                    Case "KANONENBOOT"
                        For I = 0 To Armee.Count - 1
                            Dim E As Integer = 3
                            K = New Kampfanimation("KANONENBOOT", New Size(64, 58), Armee(I), 0, 0, 5, New Point(0, 0), E)
                            If E > 0 Then
                                Kampfanimationen.Push(K)
                            End If
                        Next
                        If Kampfanimationen.Count = 0 Then
                            Kampfanimationen.Push(New Kampfanimation("KANONENBOOT", New Size(64, 58), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                        End If
                End Select
            End SyncLock
        End Sub

        ''' <summary>
        ''' Lädt ein Infanterie Bild
        ''' </summary>
        ''' <param name="Bildname"></param>
        ''' <param name="EinheitenID"></param>
        ''' <remarks></remarks>
        Private Sub InfanterieBildLaden(ByVal Bildname As String, ByVal EinheitenID As String, ByVal Armee As String())
            Dim MainOrdner As String = "CW\"
            ReDim Einheitentexturen(-1)
            ReDim EinheitentexturenMaske(-1)
            ReDim ETexturArmee(-1)
            ReDim Lauftextur(-1)
            ReDim LauftexturMaske(-1)
            ReDim LTexturArmee(-1)
            ReDim Bildgröße(-1)
            Select Case My.Settings.TerrainStyle
                Case TerrainStyle.AdvanceWars
                    MainOrdner = "AW\"
                Case TerrainStyle.AdvanceWars2
                    MainOrdner = "AW2\"
                Case TerrainStyle.CommanderWars
                    MainOrdner = "CW\"
                Case TerrainStyle.AdvanceWarsDC
                    MainOrdner = "AWDC\"
                Case TerrainStyle.CommanderWars2
                    MainOrdner = "CW2\"
                Case TerrainStyle.CustomTerrainstyle1
                    MainOrdner = "CT1\"
                Case TerrainStyle.CustomTerrainstyle2
                    MainOrdner = "CT2\"
                Case TerrainStyle.CustomTerrainstyle3
                    MainOrdner = "CT3\"
            End Select

            For I = 0 To Armee.Length - 1

                'So steh Textur laden!
                Dim Ordner As String = MainOrdner
                Dim Army As String = Armee(I)
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + ".png") = False Then
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS.png") Then
                        GoTo LauftexturLaden
                    Else
                        If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + "+" + Army + ".png") Then
                            Ordner = "CW\"
                        Else
                            GoTo LauftexturLaden
                        End If
                    End If
                End If
                Array.Resize(Einheitentexturen, Einheitentexturen.Length + 1)
                Array.Resize(EinheitentexturenMaske, EinheitentexturenMaske.Length + 1)
                Array.Resize(ETexturArmee, ETexturArmee.Length + 1)
                Dim Bild As Image = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + ".png")
                Einheitentexturen(Einheitentexturen.Length - 1) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(EinheitentexturenMaske.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + "+Maske.png"))
                ETexturArmee(ETexturArmee.Length - 1) = Army
LauftexturLaden:
                'Lauftextur Laden
                Ordner = MainOrdner
                Army = Armee(I)
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + "+Laufen.png") = False Then
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Laufen.png") Then
                        Continue For
                    Else
                        Ordner = "CW\"
                        If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + "+Laufen.png") = False Then
                            Continue For
                        End If
                    End If
                End If
                Array.Resize(Lauftextur, Lauftextur.Length + 1)
                Array.Resize(LauftexturMaske, LauftexturMaske.Length + 1)
                Array.Resize(LTexturArmee, LTexturArmee.Length + 1)
                Array.Resize(Bildgröße, Bildgröße.Length + 1)
                LTexturArmee(LTexturArmee.Length - 1) = Army

                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + "+Laufen.png") = True Then
                    Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + "+Laufen.png")
                    Lauftextur(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+" + Army + "+Laufen+Maske.png"))
                Else
                    Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + "TTP+Laufen.png")
                    Lauftextur(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + "TTP+Laufen+Maske.png"))
                End If
                Bildgröße(Bildgröße.Length - 1).Width = Bild.Width / 4
                Bildgröße(Bildgröße.Length - 1).Height = Bild.Height / 4
            Next
            If Einheitentexturen.Length = 0 Then
                ReDim Einheitentexturen(0)
                ReDim EinheitentexturenMaske(0)
                ReDim ETexturArmee(0)
                Dim Ordner As String = MainOrdner
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS.png") = False Then
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS.png") Then
                    Else
                        Ordner = "CW\"
                    End If
                End If
                Dim Bild As Image = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS.png")
                Einheitentexturen(Einheitentexturen.Length - 1) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(Einheitentexturen.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Maske.png"))
                ETexturArmee(Einheitentexturen.Length - 1) = Armeen.OS.ToString
            End If
            If Lauftextur.Length = 0 Then
                Dim Ordner As String = MainOrdner
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Laufen.png") = False Then
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Laufen.png") Then
                    Else
                        Ordner = "CW\"
                    End If
                End If
                ReDim Lauftextur(0)
                ReDim LauftexturMaske(0)
                ReDim LTexturArmee(0)
                ReDim Bildgröße(0)
                Dim Bild As Image
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Laufen.png") = True Then
                    Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Laufen.png")
                    Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+OS+Laufen+Maske.png"))
                Else
                    Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + "TTP+Laufen.png")
                    Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + "TTP+Laufen+Maske.png"))
                End If
                Bildgröße(0).Width = Bild.Width / 4
                Bildgröße(0).Height = Bild.Height / 4
            End If
            Me.EinheitenID = EinheitenID
        End Sub
        Private Sub PanzerBildLaden(ByVal Bildname As String, ByVal EinheitenID As String)
            Dim MainOrdner As String = "CW\"
            Select Case My.Settings.TerrainStyle
                Case TerrainStyle.AdvanceWars
                    MainOrdner = "AW\"
                Case TerrainStyle.AdvanceWars2
                    MainOrdner = "AW2\"
                Case TerrainStyle.CommanderWars
                    MainOrdner = "CW\"
                Case TerrainStyle.AdvanceWarsDC
                    MainOrdner = "AWDC\"
                Case TerrainStyle.CommanderWars2
                    MainOrdner = "CW2\"
                Case TerrainStyle.CustomTerrainstyle1
                    MainOrdner = "CT1\"
                Case TerrainStyle.CustomTerrainstyle2
                    MainOrdner = "CT2\"
                Case TerrainStyle.CustomTerrainstyle3
                    MainOrdner = "CT3\"
            End Select
            Array.Resize(Einheitentexturen, 1)
            Array.Resize(EinheitentexturenMaske, 1)
            Array.Resize(Lauftextur, 1)
            Array.Resize(LauftexturMaske, 1)
            Array.Resize(Bildgröße, 1)
            Dim Ordner As String = MainOrdner
            Dim Bild As Image
            If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + ".png") Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + ".png") Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + "+Maske.png"))
            Else
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP.png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP+Maske.png"))
            End If
            'Lauftextur Laden!!!

            If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+Laufen.png") = True Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\" + Ordner + Bildname + "+Laufen+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + "+Laufen.png") Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\" + Bildname + "+Laufen+Maske.png"))
            Else
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP+Laufen+Maske.png"))
            End If
            Bildgröße(0).Width = Bild.Width / 4
            Bildgröße(0).Height = Bild.Height / 4
            EinheitenID = EinheitenID
        End Sub
        ''' <summary>
        ''' Lädt das Bild einer Custom Einheit...
        ''' </summary>
        ''' <param name="Bildname"></param>
        ''' <param name="EinheitenID"></param>
        ''' <remarks></remarks>
        Private Sub CustomBildLaden(ByVal Bildname As String, ByVal EinheitenID As String)
            Array.Resize(Einheitentexturen, 1)
            Array.Resize(EinheitentexturenMaske, 1)
            Array.Resize(Lauftextur, 1)
            Array.Resize(LauftexturMaske, 1)
            Array.Resize(Bildgröße, 1)
            Dim Ordner As String = ""
            'A joined player should use these units for a Multiplayer Game
            If Hauptmenü.NetzConnected And Not Hauptmenü.NetzHosten Then
                Ordner += "Multiplayer\"
            End If
            Select Case My.Settings.CommanderWarsGameMoodus
                Case CommanderWarsGameModi.CommanderWars2
                    Ordner += "(Optional) Zoomed Out\"
                Case Else
                    Ordner += ""
            End Select
            Dim Bild As Image
            If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + ".png") Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\CW\" + Bildname + ".png") Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Maske.png"))
            Else
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP.png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP+Maske.png"))
            End If
            'Lauftextur Laden!!!

            If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Laufen.png") = True Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Laufen+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Laufen.png") Then
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Laufen+Maske.png"))
            Else
                Bild = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\Bilder\CW\TTP+Laufen+Maske.png"))
            End If
            Bildgröße(0).Width = Bild.Width / 4
            Bildgröße(0).Height = Bild.Height / 4
            EinheitenID = EinheitenID
        End Sub
        ''' <summary>
        ''' Die Lauftextur wird zurück gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetLauftextur(ByVal Armee As String) As Texture
            If Lauftextur.Length = 1 Then
                Return Lauftextur(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To LTexturArmee.Length - 1
                    If LTexturArmee(I) = Armee Then
                        Return Lauftextur(I)
                    End If
                Next
                Return Lauftextur(0)
            End If
        End Function
        ''' <summary>
        ''' Die Bildgröße wird zurück gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetBildgröße(ByVal Armee As String) As Size
            If Bildgröße.Length = 1 Then
                Return Bildgröße(0)
            Else
                For I = 0 To LTexturArmee.Length - 1
                    If LTexturArmee(I) = Armee Then
                        Return Bildgröße(I)
                    End If
                Next
                Return Bildgröße(0)
            End If
        End Function
        ''' <summary>
        ''' Die Lauftextur wird zurück gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetLauftexturMaske(ByVal Armee As String) As Texture
            If LauftexturMaske.Length = 1 Then
                Return LauftexturMaske(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To LTexturArmee.Length - 1
                    If LTexturArmee(I) = Armee Then
                        Return LauftexturMaske(I)
                    End If
                Next
                Return LauftexturMaske(0)
            End If
        End Function
        ''' <summary>
        ''' Die Einheitentexturen wird zurück gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetEinheitentextur(ByVal Armee As String) As Texture
            If Einheitentexturen.Length = 1 Then
                Return Einheitentexturen(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To ETexturArmee.Length - 1
                    If ETexturArmee(I) = Armee Then
                        Return Einheitentexturen(I)
                    End If
                Next
                Return Einheitentexturen(0)
            End If
        End Function
        ''' <summary>
        ''' Die Einheitentexturen wird zurück gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetEinheitentexturMaske(ByVal Armee As String) As Texture
            If EinheitentexturenMaske.Length = 1 Then
                Return EinheitentexturenMaske(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To ETexturArmee.Length - 1
                    If ETexturArmee(I) = Armee Then
                        Return EinheitentexturenMaske(I)
                    End If
                Next
                Return EinheitentexturenMaske(0)
            End If
        End Function
        ''' <summary>
        ''' Die Einheitentexturen wird zurück gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetKampfAnimation(ByVal Armee As String) As Kampfanimation
            If Kampfanimationen.Count = 1 Then
                Return Kampfanimationen(0)
            Else
                For I = 0 To Kampfanimationen.Count - 1
                    If Kampfanimationen(I).ArmeeID = Armee Then
                        Return Kampfanimationen(I)
                    End If
                Next
                Return Kampfanimationen(0)
            End If
        End Function
        Public Shared Function GetUnitID(ByVal EID As String) As Integer
            For I = 0 To AlleEinheiten.Length - 1
                If AlleEinheiten(I).EinheitenID = EID Then
                    Return I
                End If
            Next
            Return -1
        End Function

    End Structure
#End Region
#Region "Gebäude"
    Public Structure GebäudeTextur
        Dim Gebäudetextur() As Texture
        Dim GebäudetexturMaske() As Texture
        Dim Armee() As String
        Dim SymbolTextur As Texture
        Dim SymbolTexturMaske As Texture

        Dim GebäudeID As String

        Dim GebäudetexturNeutral As Texture
        Dim SymbolTexturNeutral As Texture

        Dim NurNeutral As Boolean
        Dim SpezialGebäude As Boolean
        Public Sub New(ByVal GebäudeID As String, ByVal SpezialGebäude As Boolean, ByVal neuTextur As String, ByVal NurNeutral As Boolean)

            Dim Ordner As String = ObjektLadeklasse.GetOrdner
            Me.GebäudeID = GebäudeID
            Me.NurNeutral = NurNeutral
            Me.SpezialGebäude = SpezialGebäude
            If SpezialGebäude Then
                LoadSpezialGebäude(False, neuTextur, Ordner)
                LoadSpezialGebäude(True, neuTextur, Ordner)
            Else
                If GebäudeID = "HQ" Then
                    LoadHQ(Ordner, True, Nothing)
                    LoadHQ(Ordner, False, Nothing)
                Else
                    LoadGebäude(neuTextur, Ordner, True)
                    LoadGebäude(neuTextur, Ordner, False)
                End If
            End If
        End Sub
        Private Sub LoadGebäude(ByVal neuTextur As String, ByVal Ordner As String, ByVal Neutral As Boolean)
            ReDim Gebäudetextur(0)
            ReDim GebäudetexturMaske(0)
            If Neutral Then
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Neutral\" + neuTextur + ".png") Then
                    GebäudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Neutral\" + neuTextur + ".png"))
                Else
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\CW\Neutral\" + neuTextur + ".png") Then
                        GebäudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\Neutral\" + neuTextur + ".png"))
                    End If
                End If
            ElseIf Not NurNeutral Then
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + neuTextur + ".png") Then
                    Gebäudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + neuTextur + ".png"))
                    GebäudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + neuTextur + "+Maske.png"))
                Else
                    Gebäudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\" + neuTextur + ".png"))
                    GebäudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\" + neuTextur + "+Maske.png"))
                End If
            End If
        End Sub
        Public Sub LoadHQ(ByVal Ordner As String, ByVal Neutral As Boolean, ByVal Spieler() As ObjektSpieler)
            If Neutral Then
                LoadGebäude("HQ", Ordner, True)
            Else
                If Spieler IsNot Nothing Then
                    For I = 0 To Spieler.Length - 1
                        If Spieler(I).Armee <> "" Then
                            If Not Armee.Contains(Spieler(I).Armee) Then
                                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "HQ+" + Spieler(I).Armee + ".png") Then
                                    Array.Resize(Gebäudetextur, Gebäudetextur.Length + 1)
                                    Array.Resize(GebäudetexturMaske, GebäudetexturMaske.Length + 1)
                                    Array.Resize(Armee, Armee.Length + 1)
                                    Gebäudetextur(Gebäudetextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "HQ+" + Spieler(I).Armee + ".png"))
                                    GebäudetexturMaske(Gebäudetextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "HQ+" + Spieler(I).Armee + "+Maske.png"))
                                    Armee(Armee.Length - 1) = Spieler(I).Armee
                                End If
                            End If
                        End If
                    Next
                Else
                    ReDim Gebäudetextur(0)
                    ReDim GebäudetexturMaske(0)
                    ReDim Armee(0)
                    Gebäudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "HQ+OS.png"))
                    GebäudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "HQ+OS+Maske.png"))
                    Armee(0) = Armeen.OS.ToString
                End If
            End If
        End Sub
        Private Sub LoadSpezialGebäude(ByVal Neutral As Boolean, ByVal neuTextur As String, ByVal Ordner As String)
            If Neutral = True Then
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Neutral\" + neuTextur + ".png") Then
                    GebäudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Neutral\" + neuTextur + ".png"))
                Else
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\CW\Neutral\" + neuTextur + ".png") Then
                        GebäudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\Neutral\" + neuTextur + ".png"))
                    End If
                End If
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\Neutral\" + neuTextur + ".png") Then
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\Neutral\" + neuTextur + ".png"))
                ElseIf My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\" + neuTextur + ".png") Then
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\" + neuTextur + ".png"))
                ElseIf My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\CW\Symbol\" + neuTextur + ".png") Then
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\Symbol\" + neuTextur + ".png"))
                Else
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\Symbol\Neutral\" + neuTextur + ".png"))
                End If
            ElseIf Not NurNeutral Then
                Array.Resize(Gebäudetextur, 1)
                Array.Resize(GebäudetexturMaske, 1)
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + neuTextur + ".png") Then
                    Gebäudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + neuTextur + ".png"))
                    GebäudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + neuTextur + "+Maske.png"))
                Else
                    Gebäudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\" + neuTextur + ".png"))
                    GebäudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\" + neuTextur + "+Maske.png"))
                End If
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\" + neuTextur + ".png") Then
                    SymbolTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\" + neuTextur + ".png"))
                    SymbolTexturMaske = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\" + Ordner + "Symbol\" + neuTextur + "+Maske.png"))
                Else
                    SymbolTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\Symbol\" + neuTextur + ".png"))
                    SymbolTexturMaske = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Gebäude\CW\Symbol\" + neuTextur + "+Maske.png"))
                End If
            End If

        End Sub
        Public Shared Sub LoadAlleGebäude()
            Array.Resize(AlleGebäude, 38)
            AlleGebäude(0) = New GebäudeTextur("MONOLITH", True, "Monolith", False)
            AlleGebäude(1) = New GebäudeTextur("SCHWARZE GESCHÜTZ+N", True, "Schwarze Geschütz+N", False)
            AlleGebäude(2) = New GebäudeTextur("SCHWARZE GESCHÜTZ+S", True, "Schwarze Geschütz+S", False)
            AlleGebäude(3) = New GebäudeTextur("SCHWARZE GESCHÜTZ+W", True, "Schwarze Geschütz+W", False)
            AlleGebäude(4) = New GebäudeTextur("SCHWARZE GESCHÜTZ+O", True, "Schwarze Geschütz+O", False)
            AlleGebäude(5) = New GebäudeTextur("FABRIK", True, "Fabrik", False)
            AlleGebäude(6) = New GebäudeTextur("SCHOCKLASER+N", True, "Schocklaser+N", False)
            AlleGebäude(7) = New GebäudeTextur("SCHOCKLASER+W", True, "Schocklaser+W", False)
            AlleGebäude(8) = New GebäudeTextur("SCHOCKLASER+S", True, "Schocklaser+S", False)
            AlleGebäude(9) = New GebäudeTextur("SCHOCKLASER+O", True, "Schocklaser+O", False)
            AlleGebäude(10) = New GebäudeTextur("OMEGARAKETE", True, "OmegaBasis", False)
            AlleGebäude(11) = New GebäudeTextur("FESTUNG", True, "Festung", False)
            AlleGebäude(12) = New GebäudeTextur("VULKAN", True, "VULKAN", True)
            AlleGebäude(13) = New GebäudeTextur("FLIEGENDEFESTUNG", True, "FliegendeFestung", False)
            AlleGebäude(14) = New GebäudeTextur("STADT", False, "STADT", False)
            AlleGebäude(15) = New GebäudeTextur("HQ", False, "HQ", False)
            AlleGebäude(16) = New GebäudeTextur("BASIS", False, "BASIS", False)
            AlleGebäude(17) = New GebäudeTextur("FLUGHAFEN", False, "FLUGHAFEN", False)
            AlleGebäude(18) = New GebäudeTextur("KRISTALL", False, "KRISTALL", False)
            AlleGebäude(19) = New GebäudeTextur("LASER", False, "LASER", False)
            AlleGebäude(20) = New GebäudeTextur("MINIGESCHÜTZ+N", False, "MINIGESCHÜTZ+N", False)
            AlleGebäude(21) = New GebäudeTextur("MINIGESCHÜTZ+S", False, "MINIGESCHÜTZ+S", False)
            AlleGebäude(22) = New GebäudeTextur("MINIGESCHÜTZ+W", False, "MINIGESCHÜTZ+W", False)
            AlleGebäude(23) = New GebäudeTextur("MINIGESCHÜTZ+O", False, "MINIGESCHÜTZ+O", False)
            AlleGebäude(24) = New GebäudeTextur("PIPESTATION", False, "PIPESTATION", False)
            AlleGebäude(25) = New GebäudeTextur("RAKETENSILO", False, "RAKETENSILO", True)
            AlleGebäude(26) = New GebäudeTextur("RAKETENSILO+RAKETE", False, "RAKETENSILO+RAKETE", True)
            AlleGebäude(27) = New GebäudeTextur("TURM", False, "TURM", False)
            AlleGebäude(28) = New GebäudeTextur("WERFT", False, "WERFT", False)
            AlleGebäude(29) = New GebäudeTextur("MINE", False, "MINE", False)
            AlleGebäude(30) = New GebäudeTextur("RADAR", False, "RADAR", False)
            AlleGebäude(31) = New GebäudeTextur("TEMPFLUGHAFEN", False, "TEMPFLUGHAFEN", False)
            AlleGebäude(32) = New GebäudeTextur("TEMPWERFT", False, "TEMPWERFT", False)
            AlleGebäude(33) = New GebäudeTextur("LABOR", False, "LABOR", False)
            AlleGebäude(34) = New GebäudeTextur("FLIEGENDESMINIGESCHÜTZ+N", False, "FLIEGENDESMINIGESCHÜTZ+N", False)
            AlleGebäude(35) = New GebäudeTextur("FLIEGENDESMINIGESCHÜTZ+S", False, "FLIEGENDESMINIGESCHÜTZ+S", False)
            AlleGebäude(36) = New GebäudeTextur("FLIEGENDESMINIGESCHÜTZ+W", False, "FLIEGENDESMINIGESCHÜTZ+W", False)
            AlleGebäude(37) = New GebäudeTextur("FLIEGENDESMINIGESCHÜTZ+O", False, "FLIEGENDESMINIGESCHÜTZ+O", False)

        End Sub
        Public Shared Function GetGebäudeZahl(ByVal Spieler As Integer) As Integer
            Dim Z As Integer = 0
            If Spieler > 0 Then
                For I = 0 To AlleGebäude.Length - 1
                    If Not AlleGebäude(I).SpezialGebäude Then
                        If Not AlleGebäude(I).NurNeutral Then
                            Z += 1
                        End If
                    End If
                Next
            Else
                For I = 0 To AlleGebäude.Length - 1
                    If Not AlleGebäude(I).SpezialGebäude Then
                        Z += 1
                    End If
                Next
            End If
            Return Z
        End Function
        Public Shared Function GetSpezialGebäudeZahl(ByVal Spieler As Integer) As Integer
            Dim Z As Integer = 0
            If Spieler > 0 Then
                For I = 0 To AlleGebäude.Length - 1
                    If AlleGebäude(I).SpezialGebäude Then
                        If Not AlleGebäude(I).NurNeutral Then
                            Z += 1
                        End If
                    End If
                Next
            Else
                For I = 0 To AlleGebäude.Length - 1
                    If AlleGebäude(I).SpezialGebäude Then
                        Z += 1
                    End If
                Next
            End If
            Return Z
        End Function
        Public Sub DrawGebäude(ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            If Spieler > 0 Then
                Dim I As Integer = 0
                If Gebäudetextur.Length > 1 Then
                    For I2 = 0 To Me.Armee.Length - 1
                        If Me.Armee(I2) = Armee Then
                            I = I2
                            Exit For
                        End If
                    Next
                End If
                Grafikengine.Sprite.Draw2D(Gebäudetextur(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                If intcolor <> Hauptmenü.NeutralFarbe Then
                    intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                Else
                    intcolor = Spielfeld.Spieler(Spieler).Farbe
                End If
                Grafikengine.Sprite.Draw2D(GebäudetexturMaske(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
            Else
                If GebäudetexturNeutral IsNot Nothing Then
                    Grafikengine.Sprite.Draw2D(GebäudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    Grafikengine.Sprite.Draw2D(Gebäudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Grafikengine.Sprite.Draw2D(GebäudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                End If

            End If
        End Sub
        Public Sub DrawSymbol(ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            If Spieler > 0 Then
                Dim I As Integer = 0
                If Gebäudetextur.Length > 1 Then
                    For I2 = 0 To Me.Armee.Length - 1
                        If Me.Armee(I2) = Armee Then
                            I = I2
                            Exit For
                        End If
                    Next
                End If
                Grafikengine.Sprite.Draw2D(SymbolTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                If intcolor <> Hauptmenü.NeutralFarbe Then
                    intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                Else
                    intcolor = Spielfeld.Spieler(Spieler).Farbe
                End If
                Grafikengine.Sprite.Draw2D(SymbolTexturMaske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
            Else
                Grafikengine.Sprite.Draw2D(SymbolTexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
            End If
        End Sub
        Public Shared Function GetSpezialGebäude(ByVal ID As Integer, ByVal Spieler As Integer) As GebäudeTextur
            Dim Z As Integer = -1
            For I = 0 To AlleGebäude.Length - 1
                If AlleGebäude(I).SpezialGebäude Then
                    If Spieler > 0 Then
                        If Not AlleGebäude(I).NurNeutral Then
                            Z += 1
                            If Z = ID Then
                                Return AlleGebäude(I)
                            End If
                        End If
                    Else
                        Z += 1
                        If Z = ID Then
                            Return AlleGebäude(I)
                        End If
                    End If
                End If
            Next
            Return Nothing
        End Function
        Public Shared Function GetSpezialGebäudeID(ByVal ID As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I = 0 To AlleGebäude.Length - 1
                If AlleGebäude(I).SpezialGebäude Then
                    If Spieler > 0 Then
                        If Not AlleGebäude(I).NurNeutral Then
                            Z += 1
                            If Z = ID Then
                                Return I
                            End If
                        End If
                    Else
                        Z += 1
                        If Z = ID Then
                            Return I
                        End If
                    End If
                End If
            Next
            Return -1
        End Function
        ''' <summary>
        ''' Die ID allerdings nicht die richtige im Array sondern das n-te Spezialgebäude
        ''' </summary>
        ''' <param name="ID"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Armee"></param>
        ''' <param name="intcolor"></param>
        ''' <param name="sngRotation"></param>
        ''' <remarks></remarks>
        Public Shared Sub DrawSpezialGebäude(ByVal ID As Integer, ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            Dim Z As Integer = GetSpezialGebäudeID(ID, Spieler)
            If Z >= 0 Then
                Dim G As GebäudeTextur = AlleGebäude(Z)
                If Spieler > 0 Then
                    Dim I As Integer = 0
                    If G.Gebäudetextur.Length > 1 Then
                        For I2 = 0 To G.Armee.Length - 1
                            If G.Armee(I2) = Armee Then
                                I = I2
                                Exit For
                            End If
                        Next
                    End If
                    Grafikengine.Sprite.Draw2D(G.Gebäudetextur(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    If intcolor <> Hauptmenü.NeutralFarbe Then
                        intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                    Else
                        intcolor = Spielfeld.Spieler(Spieler).Farbe
                    End If
                    Grafikengine.Sprite.Draw2D(G.GebäudetexturMaske(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    If G.GebäudetexturNeutral IsNot Nothing Then
                        Grafikengine.Sprite.Draw2D(G.GebäudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Else
                        Grafikengine.Sprite.Draw2D(G.Gebäudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                        Grafikengine.Sprite.Draw2D(G.GebäudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    End If
                End If
            End If
        End Sub
        ''' <summary>
        ''' Die ID allerdings nicht die richtige im Array sondern das n-te Spezialgebäude
        ''' </summary>
        ''' <param name="ID"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Armee"></param>
        ''' <param name="intcolor"></param>
        ''' <param name="sngRotation"></param>
        ''' <remarks></remarks>
        Public Shared Sub DrawSpezialGebäudeSymbol(ByVal ID As Integer, ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            Dim Z As Integer = GetSpezialGebäudeID(ID, Spieler)
            If Z >= 0 Then
                Dim G As GebäudeTextur = AlleGebäude(Z)
                If Spieler > 0 Then
                    Grafikengine.Sprite.Draw2D(G.SymbolTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    If intcolor <> Hauptmenü.NeutralFarbe Then
                        intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                    Else
                        intcolor = Spielfeld.Spieler(Spieler).Farbe
                    End If
                    Grafikengine.Sprite.Draw2D(G.SymbolTexturMaske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    If G.GebäudetexturNeutral IsNot Nothing Then
                        Grafikengine.Sprite.Draw2D(G.SymbolTexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Else
                        Grafikengine.Sprite.Draw2D(G.SymbolTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                        Grafikengine.Sprite.Draw2D(G.SymbolTexturMaske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    End If

                End If
            End If
        End Sub

        Public Shared Function GetGebäude(ByVal ID As Integer, ByVal Spieler As Integer) As GebäudeTextur
            Dim Z As Integer = -1
            For I = 0 To AlleGebäude.Length - 1
                If Not AlleGebäude(I).SpezialGebäude Then
                    If Spieler > 0 Then
                        If Not AlleGebäude(I).NurNeutral Then
                            Z += 1
                            If Z = ID Then
                                Return AlleGebäude(I)
                            End If
                        End If
                    Else
                        Z += 1
                        If Z = ID Then
                            Return AlleGebäude(I)
                        End If
                    End If
                End If
            Next
            Return Nothing
        End Function
        Public Shared Function GetGebäudeID(ByVal GebäudeZahl As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I2 = 0 To Objektverwalter.AlleGebäude.Length - 1
                If Not Objektverwalter.AlleGebäude(I2).SpezialGebäude Then
                    If Spieler > 0 Then
                        If Not Objektverwalter.AlleGebäude(I2).NurNeutral Then
                            Z += 1
                        End If
                    Else
                        Z += 1
                    End If
                End If
                If Z = GebäudeZahl Then
                    Return I2
                End If
            Next
            Return -1
        End Function
        Public Shared Sub DrawGebäude(ByVal ID As Integer, ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            Dim Z As Integer = GetGebäudeID(ID, Spieler)
            If Z >= 0 Then
                Dim G As GebäudeTextur = AlleGebäude(Z)
                If Spieler > 0 Then
                    Dim I As Integer = 0
                    If G.Gebäudetextur.Length > 1 Then
                        For I2 = 0 To G.Armee.Length - 1
                            If G.Armee(I2) = Armee Then
                                I = I2
                                Exit For
                            End If
                        Next
                    End If
                    Grafikengine.Sprite.Draw2D(G.Gebäudetextur(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    If intcolor <> Hauptmenü.NeutralFarbe Then
                        intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                    Else
                        intcolor = Spielfeld.Spieler(Spieler).Farbe
                    End If
                    Grafikengine.Sprite.Draw2D(G.GebäudetexturMaske(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    If G.GebäudetexturNeutral IsNot Nothing Then
                        Grafikengine.Sprite.Draw2D(G.GebäudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Else
                        Grafikengine.Sprite.Draw2D(G.Gebäudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                        Grafikengine.Sprite.Draw2D(G.GebäudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    End If

                End If
            End If
        End Sub

        Public Shared Function GetGebäudeID(ByVal GebäudeID As String) As Integer
            For I2 = 0 To Objektverwalter.AlleGebäude.Length - 1
                If Objektverwalter.AlleGebäude(I2).GebäudeID = GebäudeID Then
                    Return I2
                End If
            Next
            Return -1
        End Function
        Public Shared Function GetNormaleIDAusAllgemeinerID(ByVal ID As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I = 0 To Objektverwalter.AlleGebäude.Length - 1
                If Not Objektverwalter.AlleGebäude(I).SpezialGebäude Then
                    If Spieler > 0 Then
                        If Not Objektverwalter.AlleGebäude(I).NurNeutral Then
                            Z += 1
                        End If
                    Else
                        Z += 1
                    End If
                End If
                If ID = I Then
                    Return Z
                End If
            Next
            Return -1
        End Function
        Public Shared Function GetSpezialIDAusAllgemeinerID(ByVal ID As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I = 0 To Objektverwalter.AlleGebäude.Length - 1
                If Objektverwalter.AlleGebäude(I).SpezialGebäude Then
                    If Spieler > 0 Then
                        If Not Objektverwalter.AlleGebäude(I).NurNeutral Then
                            Z += 1
                        End If
                    Else
                        Z += 1
                    End If
                End If
                If ID = I Then
                    Return Z
                End If
            Next
            Return -1
        End Function
    End Structure
#End Region
    Public Shared Sub ArmeeTexturenLaden(ByVal Spieler As ObjektSpieler())
        Dim NowTicks As Long = 0
        Dim DauerTicks As Long = 0
        For I = 0 To AlleEinheiten.Length - 1
            If AlleEinheiten(I).ArmeeEinheit < EinheitenTextur.ArmeeEinheiten.Nichts Then
                NowTicks = Now.Ticks
                AlleEinheiten(I).LoadArmeeTexturen(Spieler)
                DauerTicks = Now.Ticks
                My.Settings.DurchschnittlicheLadeZeit = ((DauerTicks - NowTicks) + My.Settings.DurchschnittlicheLadeZeit) / 2
            End If
        Next
        My.Settings.Save()
        For I = 0 To AlleGebäude.Length - 1
            If AlleGebäude(I).GebäudeID = "HQ" Then
                AlleGebäude(I).LoadHQ(ObjektLadeklasse.GetOrdner, False, Spieler)
                Exit For
            End If
        Next
    End Sub
#End Region
#End Region
#Region "Objekte"
    <NonSerialized()> Public Shared Menü As ObjektFormMenü = Nothing
    <NonSerialized()> Shared Ladeklasse As ObjektLadeklasse
    <NonSerialized()> Public Shared Minimap As ObjektMinimap
    <NonSerialized()> Public Shared Maus As ObjektMaus
    <NonSerialized()> Public Shared Tabellen As Tabellenverwalter = New Tabellenverwalter()
    <NonSerialized()> Public Shared MarkierteFelder As New Stack(Of ObjektmarkiertesFeld)
    <NonSerialized()> Public Shared EinheitenMenü As ObjektEinheitenmenü
    <NonSerialized()> Public Shared AlleEinheiten() As EinheitenTextur = {}
    <NonSerialized()> Public Shared AlleGebäude() As GebäudeTextur = {}
    Public Shared Spielfeld As ObjektSpielfeld = Nothing
#End Region
#End Region
#Region "Objekte erschaffen"
    Public Shared Sub neuMarkiertesFeld(ByVal X As Integer, ByVal Y As Integer, ByVal Farbe As Color, Optional ByVal Bildfarbe As String = "Grün")
        If X >= 0 And Y >= 0 And X < Spielfeld.Breite And Y < Spielfeld.Höhe Then
            If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = False Then
                MarkierteFelder.Push(New ObjektmarkiertesFeld(X, Y, Farbe, Bildfarbe))
            End If
        End If
    End Sub
    ''' <summary>
    ''' Damit wird eine Animation die eine Einheit zerstört abgespielt
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Musikspielen As Boolean = True)
        NeuObjektAnimation(X, Y, Spielfeld.MomentaneSchlacht, Musikspielen)
    End Sub
    ''' <summary>
    ''' Damit wird eine Animation die eine Einheit zerstört abgespielt
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, Optional ByVal Musikspielen As Boolean = True)
        If X >= 0 And Y >= 0 And X < Spielfeld.Breite And Y < Spielfeld.Höhe Then
            If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Besetzen = True Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                    End If
                End If
                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
                If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    E.GetSpieler.KOS(0).SetKOEinheit(Nothing)
                End If
                BackbufferSpiel.AddAnimation(Spielfeld.Einheiten(X, Y, Schlacht).Explosion, 0, New Point(X, Y), Musikspielen, Schlacht)
                Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
            ElseIf IsNothing(Spielfeld.AktuelleEinheit) = False Then
                Dim Explosion As String = Spielfeld.AktuelleEinheit.Explosion
                If IsNothing(Spielfeld.Laufen) Then
                    Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Schlacht) = Spielfeld.AktuelleEinheit
                Else
                    Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Schlacht) = Spielfeld.AktuelleEinheit
                End If
                If Spielfeld.AktuelleEinheit.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    Spielfeld.AktuelleEinheit.GetSpieler.KOS(0).SetKOEinheit(Nothing)
                End If
                BackbufferSpiel.AddAnimation(Spielfeld.AktuelleEinheit.Explosion, 0, New Point(X, Y), Musikspielen, Schlacht)
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Besetzen = True Then
                        If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                        Else
                            Objektverwalter.Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Schlacht).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                        End If
                    End If
                End If
                Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
                Spielfeld.AktuelleEinheit = Nothing
                Spielfeld.AktuelleEinheitPosition = Nothing
                Spielfeld.Wegsuchsystem = Nothing
                Spielfeld.AktuelleEinheitPfeil = Nothing
                Spielfeld.LaufenLöschen = True
            End If
            Spielfeld.Sichterstellen()
        End If
    End Sub
    ''' <summary>
    ''' So wird eine Animation abgespielt
    ''' </summary>
    ''' <param name="Punkt"></param>
    ''' <param name="Explosion"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal Punkt As Point, ByVal Explosion As String, ByVal Schlacht As Integer, Optional ByVal Musikspielen As Boolean = True)
        If Punkt.X >= 0 And Punkt.Y >= 0 And Punkt.X < Spielfeld.Breite And Punkt.Y < Spielfeld.Höhe Then
            BackbufferSpiel.AddAnimation(Explosion, 0, Punkt, Musikspielen, Schlacht)
            ZuFeldgehen(Punkt.X, Punkt.Y)
        End If
    End Sub
    ''' <summary>
    ''' So wird ein Pfeil zur Info Anzeige erstellt 
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Bild"></param>
    ''' <param name="Sound"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal X As Integer, ByVal Y As Integer, ByVal Bild As String, ByVal Sound As String, Optional ByVal Musikspielen As Boolean = True)
        BackbufferSpiel.AddAnimation(Bild.ToUpper, 0, New Point(X, Y), Musikspielen, Objektverwalter.Spielfeld.MomentaneSchlacht)
    End Sub
#End Region

#Region "Malen"
    Public Shared Sub LoadHintergrund(ByVal Bildpfad As String)
        texturHintergrungBild = Grafikengine.LoadTexture(Bildpfad)
    End Sub
    Public Shared Sub LoadVordergrund(ByVal Bildpfad As String)
        texturVordergrundBild = Grafikengine.LoadTexture(Bildpfad)
    End Sub
    Public Shared Sub VorHinBildmalen(ByVal Bild As Texture)
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        'prüfen ob wir aus den Screenbereich laufen


        'Festlegen welchen Bereich vom Bitmap wir kopieren

        'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild
        If My.Settings.Verhältnis = Hauptmenü.Breitbild Then
            With Grafikengine.recBild
                .X = 0 : .Width = 1280
                .Y = 0 : .Height = 800
            End With
        Else
            With Grafikengine.recBild
                .X = 0 : .Width = 800
                .Y = 0 : .Height = 600
            End With
        End If

        'Achtung Rotationszentrum ist auch Ausgangspunkt der bemalung
        With Grafikengine.ptfRotCenter
            .X = 0
            .Y = 0
        End With
        'Ausschnitte in den Backbuffer zeichnen
        'Wo wird das Bild gezeichnet
        Grafikengine.ptfPosition = New Drawing.Point(0, 0)
        '... und wie breit ist es
        With Grafikengine.szfScale
            .Height = Grafikengine.SCREENHEIGHT
            .Width = Grafikengine.SCREENWIDTH
        End With
        'jetzt wird es in den Backbuffer gezeichnet
        Grafikengine.Sprite.Draw2D(Bild, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
    End Sub
    Public Shared Function Malen() As Boolean
        If Not texturHintergrungBild = Nothing Then
            If My.Settings.draw3D And Spielfeld IsNot Nothing Then
            Else
                VorHinBildmalen(texturHintergrungBild)
            End If
        End If

        If IsNothing(Spielfeld) = False Then
            Spielfeld.Malen()
        End If
        If IsNothing(Minimap) = False Then
            Minimap.Malen()
        End If
        If Not Menü Is Nothing Then Menü.Malen()
        If ObjekteMalen() = False Then
            Return False
        End If


        'Zuletzt wird die Maus gemalt
        ObjektMaus.Malen()
        If Not texturVordergrundBild = Nothing Then
            VorHinBildmalen(texturVordergrundBild)
        End If
        Return True
    End Function
    Private Shared Function ObjekteMalen() As Boolean
        If IsNothing(EinheitenMenü) = False Then
            If EinheitenMenü.Malen() = False Then
                Return False
            End If
        End If
        Return True
    End Function
#End Region
    Public Shared Sub ZuFeldgehen(ByVal XinFeldern As Integer, ByVal YinFeldern As Integer)
        Dim Punkt As New Point(XinFeldern * Hauptmenü.Feldbreite, YinFeldern * Hauptmenü.Feldbreite)
        If Punkt.X - Hauptmenü.Feldbreite / 2 < Hauptmenü.Rechteck.X + Spielfeld.BildschirmKooX And Punkt.X + Hauptmenü.Feldbreite / 2 > Spielfeld.BildschirmKooX + Hauptmenü.Rechteck.X + Hauptmenü.Rechteck.Width Then
            Spielfeld.BildschirmKooX = -(XinFeldern * Hauptmenü.Feldbreite - Hauptmenü.Rechteck.Width / 2 - Hauptmenü.Rechteck.X)
        End If
        If Punkt.Y - Hauptmenü.Feldbreite / 2 < Hauptmenü.Rechteck.Y + Spielfeld.BildschirmKooY And Punkt.Y + Hauptmenü.Feldbreite / 2 > Spielfeld.BildschirmKooY + Hauptmenü.Rechteck.Y + Hauptmenü.Rechteck.Height Then
            Spielfeld.BildschirmKooY = -(YinFeldern * Hauptmenü.Feldbreite - Hauptmenü.Rechteck.Height / 2 - Hauptmenü.Rechteck.Y)
        End If
        If Objektverwalter.Spielfeld.KI Is Nothing Then
            Select Case Hauptmenü.Formmodus
                Case Hauptmenü.Formmodi.Spiel
                    VomRandEntfernen(False)
                Case Else
                    VomRandEntfernen(True)
            End Select

        Else
            VomRandEntfernen(True)
        End If
    End Sub
    Public Shared Sub VomRandEntfernen(ByVal MitZentrieren As Boolean)
        If MitZentrieren Then
            If Hauptmenü.Rechteck.Y + Hauptmenü.Feldbreite / 2 < Spielfeld.BildschirmKooY Then
                Spielfeld.BildschirmKooY = Hauptmenü.Rechteck.Y + Hauptmenü.Feldbreite
            ElseIf (Spielfeld.Höhe + 1) * Hauptmenü.Feldbreite * -1 + Hauptmenü.MainMenü.MalPanel.Height - (Hauptmenü.MainMenü.MalPanel.Height - Hauptmenü.Rechteck.Height) + Hauptmenü.Feldbreite / 2 + Hauptmenü.Rechteck.Y > Spielfeld.BildschirmKooY Then
                Spielfeld.BildschirmKooY = (Spielfeld.Höhe + 1) * Hauptmenü.Feldbreite * -1 + Hauptmenü.MainMenü.MalPanel.Height - (Hauptmenü.MainMenü.MalPanel.Height - Hauptmenü.Rechteck.Height) + Hauptmenü.Feldbreite + Hauptmenü.Rechteck.Y
            End If
            If Hauptmenü.Rechteck.X + Hauptmenü.Feldbreite / 2 < Spielfeld.BildschirmKooX Then
                Spielfeld.BildschirmKooX = Hauptmenü.Rechteck.X + Hauptmenü.Feldbreite
            ElseIf (Spielfeld.Breite + 1) * (Hauptmenü.Feldbreite) * -1 + Hauptmenü.MainMenü.MalPanel.Width - (Hauptmenü.MainMenü.MalPanel.Width - Hauptmenü.Rechteck.Width) + Hauptmenü.Feldbreite / 2 + Hauptmenü.Rechteck.X > Spielfeld.BildschirmKooX Then
                Spielfeld.BildschirmKooX = (Spielfeld.Breite + 1) * (Hauptmenü.Feldbreite) * -1 + Hauptmenü.MainMenü.MalPanel.Width - (Hauptmenü.MainMenü.MalPanel.Width - Hauptmenü.Rechteck.Width) + Hauptmenü.Feldbreite + Hauptmenü.Rechteck.X
            End If
            Zentrieren()
        End If
    End Sub
    Public Shared Sub Zentrieren()
        If Not Spielfeld Is Nothing Then
            If My.Settings.AutoResizeWindow And My.Settings.Fenstermodus Then
                Spielfeld.BildschirmKooX = Hauptmenü.Feldbreite / 2
                Spielfeld.BildschirmKooY = Hauptmenü.Feldbreite / 2
            Else
                If Hauptmenü.Feldbreite * Spielfeld.Höhe < Hauptmenü.Rechteck.Height Then
                    Spielfeld.BildschirmKooY = (Hauptmenü.Rechteck.Height - Hauptmenü.Feldbreite * Spielfeld.Höhe) / 2 + Hauptmenü.Rechteck.Y
                End If
                If Hauptmenü.Feldbreite * Spielfeld.Breite < Hauptmenü.Rechteck.Width Then
                    Spielfeld.BildschirmKooX = (Hauptmenü.Rechteck.Width - Hauptmenü.Feldbreite * Spielfeld.Breite) / 2 + Hauptmenü.Rechteck.X
                End If
            End If
        End If
    End Sub
    Public Shared Sub Reset(ByVal SpielfeldNichtlöschen As Boolean)
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Spielfeld.BildschirmKooX = 0
            Spielfeld.BildschirmKooY = 0
        End If
        texturHintergrungBild = Nothing
        texturVordergrundBild = Nothing
        If SpielfeldNichtlöschen = False Then
            Spielfeld = Nothing
        End If
        EinheitenMenü = Nothing
        Minimap = Nothing
        BackbufferSpiel.DeleteAllAnimations()
        MarkierteFelder.Clear()
    End Sub
#Region "Initialisierung"
    Public Shared Sub IniVerwalter()
        Ladeklasse = New ObjektLadeklasse
        ABCBild = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Objekte\ABC.png")
        If My.Settings.draw3D Then ObjektLadeklasse.Load3D()
        Pfeileladen()
        'Die Spieltexturen laden!
        LoadNewGameModus(My.Settings.TerrainStyle - 1)

        ObjektKOInformation.LoadTextur()
        Dim G As New KampfGrafiken
    End Sub

    Public Shared Sub Pfeileladen()
        Array.Resize(Pfeile, 4)
        Dim Bild As Image = Image.FromFile(My.Settings.Resourcenpfad + "Pfeile\Pfeil+L.png")
        Pfeile(0) = Grafikengine.LoadTexture(Bild)
        Bild.RotateFlip(RotateFlipType.RotateNoneFlipX)
        Pfeile(1) = Grafikengine.LoadTexture(Bild)
        Bild = Image.FromFile(My.Settings.Resourcenpfad + "Pfeile\Pfeil+O.png")
        Pfeile(2) = Grafikengine.LoadTexture(Bild)
        Bild.RotateFlip(RotateFlipType.RotateNoneFlipY)
        Pfeile(3) = Grafikengine.LoadTexture(Bild)

    End Sub
    Public Shared Sub Symbolfunktionenladen()
        Array.Resize(Symbole, 0)
        Array.Resize(Symbolfunktion, 0)
        If Hauptmenü.ZoomedIn Then
            For Each Symbol In My.Computer.FileSystem.GetFiles(My.Settings.Resourcenpfad + "Symbole\Zoomed In\", FileIO.SearchOption.SearchTopLevelOnly, "*.png")
                Array.Resize(Symbole, Symbole.Length + 1)
                Array.Resize(Symbolfunktion, Symbole.Length)
                Symbole(Symbole.Length - 1) = Grafikengine.LoadTexture(Symbol)
                Dim Name As String = Symbol.Remove(0, Symbol.LastIndexOf("\") + 1)
                Name = Name.Remove(Name.LastIndexOf("."))
                Symbolfunktion(Symbolfunktion.Length - 1) = Name
            Next
        Else
            For Each Symbol In My.Computer.FileSystem.GetFiles(My.Settings.Resourcenpfad + "Symbole\Zoomed Out\", FileIO.SearchOption.SearchTopLevelOnly, "*.png")
                Array.Resize(Symbole, Symbole.Length + 1)
                Array.Resize(Symbolfunktion, Symbole.Length)
                Symbole(Symbole.Length - 1) = Grafikengine.LoadTexture(Symbol)
                Dim Name As String = Symbol.Remove(0, Symbol.LastIndexOf("\") + 1)
                Name = Name.Remove(Name.LastIndexOf("."))
                Symbolfunktion(Symbolfunktion.Length - 1) = Name
            Next
        End If
    End Sub
    Public Shared Sub KOTexturenLaden()
        Dim NeueKos() As KO = {}
        Array.Resize(KOS, 0)
        ObjektLadeklasse.KOLaden(NeueKos)
        Array.Resize(TagzuTagAnzeige, 0)
        Array.Resize(TagzuTagArmee, 0)

        KOeinerArmeeHinzufügen(NeueKos, Armeen.OS.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.BM.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.GE.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.YC.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.BH.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.MA.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.AC.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.BD.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.JS.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.PC.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.TG.ToString)
        KOeinerArmeeHinzufügen(NeueKos, Armeen.DM.ToString)

        For I = 0 To NeueKos.Length - 1
            If Not NeueKos(I).Armee = Armeen.OS.ToString.ToString And Not NeueKos(I).Armee = Armeen.BM.ToString.ToString And Not NeueKos(I).Armee = Armeen.GE.ToString.ToString And Not NeueKos(I).Armee = Armeen.YC.ToString.ToString And Not NeueKos(I).Armee = Armeen.BH.ToString.ToString And Not NeueKos(I).Armee = Armeen.MA.ToString.ToString And Not NeueKos(I).Armee = Armeen.AC.ToString.ToString And Not NeueKos(I).Armee = Armeen.BD.ToString.ToString And Not NeueKos(I).Armee = Armeen.JS.ToString.ToString And Not NeueKos(I).Armee = Armeen.PC.ToString.ToString And Not NeueKos(I).Armee = Armeen.TG.ToString.ToString And Not NeueKos(I).Armee = Armeen.DM.ToString.ToString Then
                KOeinerArmeeHinzufügen(NeueKos, NeueKos(I).Armee)
            End If
        Next

        'Dim S As Sprachen = My.Settings.Sprache
        'Using W As New System.IO.StreamWriter("C:\Programmierung\Commander Wars\Programm\Commander Wars\Output\KOS+" + S.ToString + ".txt")
        '    For i = 0 To KOS.Length - 1
        '        W.WriteLine(KOS(i).KOID + "=" + KOS(i).KOBeschreibung.Name)
        '    Next
        'End Using

    End Sub
    Public Shared Sub KOeinerArmeeHinzufügen(ByVal NeueKOS() As KO, ByVal Armee As String)
        Array.Resize(TagzuTagAnzeige, TagzuTagAnzeige.Length + 1)
        TagzuTagAnzeige(TagzuTagAnzeige.Length - 1) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Objekte\Tag" + Armee + ".png")
        Array.Resize(TagzuTagArmee, TagzuTagArmee.Length + 1)
        TagzuTagArmee(TagzuTagArmee.Length - 1) = Armee
        For I = 0 To NeueKOS.Length - 1
            If NeueKOS(I).Armee = Armee Then
                Array.Resize(KOS, KOS.Length + 1)
                KOS(KOS.Length - 1) = NeueKOS(I)
            End If
        Next
    End Sub
    Public Shared Sub LoadNewGameModus(ByVal OldModus As Integer)
        If OldModus <> My.Settings.TerrainStyle Then
            If My.Settings.TerrainStyle = TerrainStyle.CommanderWars2 Then
                LoadZoom(True)
            Else
                LoadZoom(False)
            End If
            Select Case My.Settings.TerrainStyle
                Case TerrainStyle.CommanderWars2, TerrainStyle.AdvanceWarsDC
                    'ein Frame mehr!
                    ObjektLandschaft.MaxFrames = 4
                    ObjektLandschaft.HochZählen = 1
                Case Else
                    ObjektLandschaft.MaxFrames = 3
                    ObjektLandschaft.HochZählen = 0
            End Select
            ObjektLadeklasse.LandschaftsTexturenladen()
            TexturenHalter.LoadModusTexturen()
        End If
        Objektverwalter.Tabellen = New Tabellenverwalter()
        'So dann läuft alles wie es soll.
        ObjektLadeklasse.AlleEinheitenLaden()
        Objektverwalter.GebäudeTextur.LoadAlleGebäude()

        KOTexturenLaden()

    End Sub
    ''' <summary>
    ''' Erstellt die Engine so, dass wir 24 x 24 Bilder nutzen können oder 16 x 16
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Sub LoadZoom(ByVal ZoomedIn As Boolean)
        If ZoomedIn Then
            Hauptmenü.Feldbreite = Hauptmenü.FeldbreiteGroß
            Hauptmenü.ZoomedIn = True
            'So jetzt der Ini Teil
            ObjektMaus.CursorLaden()
            ObjektmarkiertesFeld.DeleteTexturen()
            ObjektAnimation.DeleteAnimationsTexturen()
            Symbolfunktionenladen()

        Else
            Hauptmenü.Feldbreite = Hauptmenü.FeldbreiteKlein
            Hauptmenü.ZoomedIn = False
            'So jetzt der Ini Teil
            ObjektMaus.CursorLaden()
            ObjektmarkiertesFeld.DeleteTexturen()
            ObjektAnimation.DeleteAnimationsTexturen()
            Symbolfunktionenladen()

        End If
        'Neue Werte durch andere Feldbreite allgemein gültig
        ObjektLandschaft.ÜbergangsBreite = Hauptmenü.Feldbreite * 5 / 2
    End Sub
#End Region
    Public Shared Function Bewegungskosten(ByVal Einheit As ObjektEinheit, ByVal Landschaft As String, ByVal Wetter As ObjektSpielfeld.Wetterarten, ByVal X As Integer, ByVal Y As Integer) As Integer
        If Einheit.Spieler = 0 Then
            Return 1
        Else
            Landschaft = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GetLandschaft(Landschaft)

            Dim I As Integer = Array.IndexOf(Spielfeld.Spieler(Einheit.Spieler).KOS(0).Bewegunssenker, Wetter)
            Dim Bewegungspunkte As Integer = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeränderteWerte.Bewegungskosten
            Dim BÄnderung As Integer = -1
            If I >= 0 Then
                If Spielfeld.Spieler(Einheit.Spieler).KOS(0).Bewegungswetter(I) = ObjektKO.Bewegungsarten.Eins Then
                    If Tabellenverwalter.GetWert(Einheit.Bewegungsart + "+" + Wetter.ToString, Landschaft) > 0 Then
                        Bewegungspunkte += 1
                    Else
                        Bewegungspunkte = -1
                    End If
                Else
                    BÄnderung = Tabellenverwalter.GetWert(Einheit.Bewegungsart + "+" + Spielfeld.Spieler(Einheit.Spieler).KOS(0).Bewegungswetter(I).ToString, Landschaft)
                    If BÄnderung < 0 Then
                        Return -1
                    Else
                        Bewegungspunkte += BÄnderung
                    End If
                End If
            Else
                BÄnderung = Tabellenverwalter.GetWert(Einheit.Bewegungsart + "+" + Wetter.ToString, Landschaft)
                If BÄnderung < 0 Then
                    Return -1
                Else
                    Bewegungspunkte += BÄnderung
                End If
            End If
            'Manche KOs haben auf gewissen Landschaften feste Bewegungskosten.
            If Bewegungspunkte > 0 Then
                If FindElement(Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).BewegungskostenUntergrund, Landschaft) >= 0 Then
                    Bewegungspunkte = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).NeueBewegungskosten(FindElement(Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).BewegungskostenUntergrund, Landschaft))
                End If
                'Manche KOs setzen die Bewegungspunkte auf manchen Feldern fest
                For Each Feld In Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeränderteWerte.VeränderteBewegungsFelder
                    If Feld.X = X And Feld.Y = Y Then
                        Bewegungspunkte = Feld.Z
                    End If
                Next
            End If
            Return Bewegungspunkte
        End If
    End Function
    ''' <summary>
    ''' Gibt an ob die Einheit auf dieses Feld plaziert werden kann 
    ''' </summary>
    ''' <param name="Bewegungsart"></param>
    ''' <param name="Landschaft"></param>
    ''' <param name="Wetter"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Bewegungskosten(ByVal Bewegungsart As String, ByVal Landschaft As String, ByVal Wetter As ObjektSpielfeld.Wetterarten) As Integer
        Return Tabellenverwalter.GetWert(Bewegungsart + "+" + Wetter.ToString, Landschaft)
    End Function
    ''' <summary>
    ''' Wenn auf diesem Feld eine Einheit ist wird sie ausgewählt
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Function ExistiertMarkiertesFeldschon(ByVal X As Integer, ByVal Y As Integer) As Boolean
        For I = 0 To MarkierteFelder.Count - 1
            If MarkierteFelder(I).X = X And MarkierteFelder(I).Y = Y Then
                Return True
            End If
        Next
        Return False
    End Function
#Region "Einheiten Befehle"
#Region "Menü erschaffen"
    Public Shared Sub addMenüitem(ByVal Name As String, ByVal Symbol As Texture, ByRef Symbole As Stack(Of Texture), ByRef Namen As Stack(Of String), Optional ByVal Enabled As Boolean = False, Optional ByRef Enables As Stack(Of Boolean) = Nothing, Optional ByVal NeuSymbolMaske As Texture = Nothing, Optional ByRef SymbolMasken As Stack(Of Texture) = Nothing)
        Namen.Push(Name)
        Symbole.Push(Symbol)
        If Not Enables Is Nothing Then
            Enables.Push(Enabled)
        End If
        If SymbolMasken IsNot Nothing Then
            SymbolMasken.Push(NeuSymbolMaske)
        End If
    End Sub
#Region "Befehlsmenü"
    Public Shared Sub Befehlsmenüerschaffen()
        Dim Symbolen As New Stack(Of Texture)
        Dim Namen As New Stack(Of String)
        Dim SymbolMasken As New Stack(Of Texture)
        Dim NichtBewegt As Boolean = IsNothing(Spielfeld.Laufen)
        Dim FeldBesetzt As Boolean = False
        If NichtBewegt = False Then
            FeldBesetzt = IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht))
        End If
        If NichtBewegt = False Then
            If FeldBesetzt = False Then

                If KannGeladenwerden(Spielfeld.AktuelleEinheit, Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = True Then
                    Namen.Push("Fracht")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Transport.png"))
                End If

                If KannEinen() = True Then
                    Namen.Push("Einen")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Einen.png"))
                End If

                If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Höllium.tostring Then
                    Namen.Push("Warten")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Warten.png"))
                End If

            Else
                'Die Einheit hat sich bewegt

                If KannBesetzen(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y) Then
                    Namen.Push("Besetzen")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Besetzen.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If (TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Or TypeOf Spielfeld.AktuelleEinheit Is EinheitBaupanzer Or TypeOf Spielfeld.AktuelleEinheit Is EinheitCustom) Then
                    If CanBuildTempBase() Then
                        Namen.Push("Basis bauen")
                        Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Besetzen.png"))
                        SymbolMasken.Push(Nothing)
                    End If
                End If

                If KannAngreifen(Spielfeld.AktuelleEinheit, NichtBewegt) = True Then
                    Namen.Push("Feuer")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If KannSchicken() Then
                    Namen.Push("Einheit schicken")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Einheit schicken.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If KannRaketeZünden() Then
                    Namen.Push("Zünden")
                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If KannEntladen() Then

                    For Each Einheit In Spielfeld.AktuelleEinheit.Ladung
                        If IsNothing(Einheit) = False Then
                            If KannEntladen(Einheit, Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y) Then
                                Dim ID As Integer = 0
                                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                    If AlleEinheiten(I).EinheitenID = Einheit.EinheitenID Then
                                        ID = I
                                        Exit For
                                    End If
                                Next

                                Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                                Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                                Namen.Push(Einheit.Einheitenname)
                                Symbolen.Push(Symbol)
                                SymbolMasken.Push(Maske)
                            End If
                        End If
                    Next
                End If

                If Spielfeld.AktuelleEinheit.KannTarnen = True Then
                    If Spielfeld.AktuelleEinheit.IsGetaucht = True Then
                        Namen.Push("Auftauchen")
                        Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Tauchen.png"))
                        SymbolMasken.Push(Nothing)
                    Else
                        Namen.Push("Tarnen")
                        Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Tauchen.png"))
                        SymbolMasken.Push(Nothing)
                    End If
                End If
                Dim F As String() = Spielfeld.AktuelleEinheit.Fähigkeit.ToLower.Split("+")
                For I = 0 To F.Length - 1
                    Select Case F(I)
                        Case "ration"
                            If KannRation() Then
                                Namen.Push("Ration")
                                Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Ration.png"))
                                SymbolMasken.Push(Nothing)
                            End If
                        Case "reparieren"
                            If KannRation() Then
                                Namen.Push("Reparieren")
                                Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Heilen.png"))
                                SymbolMasken.Push(Nothing)
                            End If
                        Case "explosion"
                            Namen.Push("Explosion")
                            Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"))
                            SymbolMasken.Push(Nothing)
                        Case "truppenbau"
                            If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                    If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                        Namen.Push("Truppenbau")
                                        Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"))
                                        SymbolMasken.Push(Nothing)
                                    End If
                                End If
                            Else
                                Namen.Push("Truppenbau")
                                Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"))
                                SymbolMasken.Push(Nothing)
                            End If
                        Case "bauen"
                            Namen.Push("Bauen")
                            Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"))
                            SymbolMasken.Push(Nothing)
                        Case "feuerrakete"
                            Namen.Push("Feuerrakete")
                            Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"))
                            SymbolMasken.Push(Nothing)
                        Case "moveandfire"
                            If KannAngreifen(Spielfeld.AktuelleEinheit, True) = True Then
                                If Namen.Contains("Feuer") = False Then
                                    Namen.Push("Feuer")
                                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"))
                                    SymbolMasken.Push(Nothing)
                                End If
                            End If
                        Case "truppenbau+moveandfire"
                            If KannAngreifen(Spielfeld.AktuelleEinheit, True) = True Then
                                If Namen.Contains("Feuer") = False Then
                                    Namen.Push("Feuer")
                                    Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"))
                                    SymbolMasken.Push(Nothing)
                                End If
                            End If
                            If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                    If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                        Namen.Push("Truppenbau")
                                        Symbolen.Push(Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"))
                                        SymbolMasken.Push(Nothing)
                                    End If
                                End If
                            Else
                                addMenüitem("Truppenbau", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                            End If
                        Case "bauen+ration"
                            addMenüitem("Bauen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                            If KannRation() Then
                                addMenüitem("Ration", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Ration.png"), Symbolen, Namen, , , , SymbolMasken)
                            End If
                    End Select
                Next
                If KannZuKOAufwerten() Then
                    addMenüitem("KO Einheit", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)
                End If

                addMenüitem("Warten", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)
            End If
        Else
            'Die Einheit hat sich nicht bewegt

            If KannBesetzen(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y) Then
                addMenüitem("Besetzen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Besetzen.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If (TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Or TypeOf Spielfeld.AktuelleEinheit Is EinheitBaupanzer Or TypeOf Spielfeld.AktuelleEinheit Is EinheitCustom) Then
                If CanBuildTempBase() Then
                    addMenüitem("Basis bauen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Besetzen.png"), Symbolen, Namen, , , , SymbolMasken)
                End If
            End If

            If KannAngreifen(Spielfeld.AktuelleEinheit, NichtBewegt) = True Then
                addMenüitem("Feuer", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If KannSchicken() Then
                addMenüitem("Einheit schicken", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Einheit schicken.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If KannRaketeZünden() Then
                addMenüitem("Zünden", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If KannEntladen() Then
                For Each Einheit In Spielfeld.AktuelleEinheit.Ladung
                    If IsNothing(Einheit) = False Then
                        If KannEntladen(Einheit, Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y) Then
                            Dim ID As Integer = 0
                            For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If AlleEinheiten(I).EinheitenID = Einheit.EinheitenID Then
                                    ID = I
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                            addMenüitem(Einheit.Einheitenname, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                        End If
                    End If
                Next
            End If

            If Spielfeld.AktuelleEinheit.KannTarnen = True Then
                If Spielfeld.AktuelleEinheit.IsGetaucht = True Then
                    addMenüitem("Auftauchen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Auftauchen.png"), Symbolen, Namen, , , , SymbolMasken)
                Else
                    addMenüitem("Tarnen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Tauchen.png"), Symbolen, Namen, , , , SymbolMasken)
                End If
            End If

            Dim F As String() = Spielfeld.AktuelleEinheit.Fähigkeit.ToLower.Split("+")
            For I = 0 To F.Length - 1
                Select Case F(I)
                    Case "ration"
                        If KannRation() Then
                            addMenüitem("Ration", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Ration.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "reparieren"
                        If KannRation() Then
                            addMenüitem("Reparieren", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Heilen.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "explosion"
                        addMenüitem("Explosion", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
                    Case "truppenbau"
                        If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
                            If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                    addMenüitem("Truppenbau", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                                End If
                            End If
                        Else
                            addMenüitem("Truppenbau", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "bauen"
                        addMenüitem("Bauen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                    Case "feuerrakete"
                        addMenüitem("feuerrakete", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
                    Case "truppenbau+moveandfire"
                        If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
                            If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                    addMenüitem("Truppenbau", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                                End If
                            End If
                        Else
                            addMenüitem("Truppenbau", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "bauen+ration"
                        addMenüitem("Bauen", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                        If KannRation() Then
                            addMenüitem("Ration", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Ration.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                End Select
            Next
            If KannZuKOAufwerten() Then
                addMenüitem("KO Einheit", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            addMenüitem("Warten", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Menüicons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)
        End If
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.AuswahlmenüEinheit
        EinheitenMenü = New ObjektEinheitenmenü(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes, SymbolMasken.ToArray)
    End Sub
    Public Shared Function KannGeladenwerden(ByVal Einheit As ObjektEinheit, ByVal Frachter As ObjektEinheit) As Boolean
        If IsNothing(Frachter) = False Then
            If FindElement(Frachter.GeladeneEinheitenIDs, Einheit.EinheitenID) >= 0 Then
                For I = 0 To Frachter.Ladung.Length - 1
                    If IsNothing(Frachter.Ladung(I)) Then
                        Return True
                    End If
                Next
            Else
                Return False
            End If
        Else
            Return False
        End If
        Return False
    End Function

    Public Shared Function KannAngreifen(ByVal Einheit As ObjektEinheit, Optional ByVal NichtBewegt As Boolean = False) As Boolean
        Dim Kreis(,) As Integer = {}
        Dim MaximalReichweite As Integer = -1
        Dim Minmalreichweite As Integer = Einheit.MinimaleReichweite
        Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
        Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
        If IsNothing(Spielfeld.Laufen) = False Then
            XPosition = Spielfeld.Laufen.Position.X
            YPosition = Spielfeld.Laufen.Position.Y
        End If
        MaximalReichweite = Spielfeld.AktuelleEinheit.MaximaleReichweite
        Dim Stelle As Integer = Array.IndexOf(Spielfeld.AktuellerSpieler.KOS(0).WetterartfürSenker, Spielfeld.Regeln.Wetter)
        Kreis = Kreisfunktion(MaximalReichweite)
        If Kreis.Length >= 0 Then
            For X = 0 To Kreis.GetLength(0) - 1
                For Y = 0 To Kreis.GetLength(1) - 1
                    If Kreis(X, Y) > 0 Then
                        If Kreis(X, Y) >= Spielfeld.AktuelleEinheit.MinimaleReichweite Or Not Einheit.Waffe1 = "Keine" Then
                            If XPosition - MaximalReichweite + X >= 0 And XPosition - MaximalReichweite + X < Spielfeld.Breite And YPosition - MaximalReichweite + Y >= 0 And YPosition - MaximalReichweite + Y < Spielfeld.Höhe Then
                                If IsNothing(Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap)) = False Then
                                    If Not Spielfeld.Spieler(Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                                        If Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Sichtbar = True Then
                                            Dim Fernkampf As Boolean = False
                                            If Kreis(X, Y) > 1 Then
                                                Fernkampf = True
                                            End If
                                            If Schadensberechnung(Spielfeld.AktuelleEinheit, XPosition, YPosition, XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, 100, 100)(0) >= 0 Then
                                                Return True
                                            End If
                                        End If
                                    End If
                                ElseIf Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Leben > 0 Then
                                    Dim Fernkampf As Boolean = False
                                    If Kreis(X, Y) > 1 Then
                                        Fernkampf = True
                                    End If
                                    If Schadensberechnung(Spielfeld.AktuelleEinheit, XPosition, YPosition, XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, 100, 100)(0) >= 0 Then
                                        Return True
                                    End If
                                ElseIf IsNothing(Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebäude) = False Then
                                    If Spielfeld.Landschaften(Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebäude.Rechteck.X, Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebäude.Rechteck.Y, Einheit.GetMap).Gebäude.KP > 0 Then
                                        If Not Spielfeld.Spieler(Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebäude.Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                                            Dim Fernkampf As Boolean = False
                                            If Kreis(X, Y) > 1 Then
                                                Fernkampf = True
                                            End If
                                            If Schadensberechnung(Spielfeld.AktuelleEinheit, XPosition, YPosition, XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, 100, 100)(0) >= 0 Then
                                                Return True
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
        Return False
    End Function
    Public Shared Function KannEinen() As Boolean
        If Spielfeld.AktuelleEinheit.EinheitenID = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).EinheitenID Then
            If Spielfeld.AktuelleEinheit.Spieler = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).Spieler Then
                If Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).KP <= 90 Then
                    Return True
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function KannEntladen() As Boolean
        If Spielfeld.AktuelleEinheit.Ladung.Length > 0 Then
            If IsNothing(Spielfeld.AktuelleEinheit.Ladung(0)) = False Then
                If IsNothing(Spielfeld.Laufen) Then
                    If Array.IndexOf(Spielfeld.AktuelleEinheit.EntladungsUntergrund, Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.AktuelleEinheit.GetMap).getID) >= 0 Then
                        Return True
                    End If
                Else
                    If Array.IndexOf(Spielfeld.AktuelleEinheit.EntladungsUntergrund, Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).getID) >= 0 Then
                        Return True
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function KannEntladen(ByVal ZuentladendeEinheit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Feld As New Point(X, Y)
        For I = 0 To 3
            Select Case I
                Case 0
                    Feld.Y -= 1
                Case 1
                    Feld.Y += 1
                    Feld.X += 1
                Case 2
                    Feld.Y += 1
                    Feld.X -= 1
                Case 3
                    Feld.Y -= 1
                    Feld.X -= 1
            End Select
            If Feld.X >= 0 And Feld.X < Spielfeld.Breite And Feld.Y >= 0 And Feld.Y < Spielfeld.Höhe Then
                If Bewegungskosten(ZuentladendeEinheit, Spielfeld.Landschaften(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).getID, Spielfeld.Regeln.Wetter, Feld.X, Feld.Y) > 0 And IsNothing(Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap)) = True Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function
    Public Shared Function KannBesetzen(ByVal X As Integer, ByVal Y As Integer) As Boolean
        If IsNothing(Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebäude) = False Then
            If Spielfeld.AktuelleEinheit.KannBesetzen = True Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebäude.Besetzung > 0 Then
                    If Not Spielfeld.Spieler(Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebäude.Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                        Return True
                    End If
                End If
            End If
        End If
    End Function
    Public Shared Function KannRation() As Boolean
        Dim Feld As Point
        If IsNothing(Spielfeld.Laufen) Then
            Feld = New Point(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
        Else
            Feld = New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
        End If
        For I = 0 To 3
            Select Case I
                Case 0
                    Feld.Y -= 1
                Case 1
                    Feld.Y += 1
                    Feld.X += 1
                Case 2
                    Feld.Y += 1
                    Feld.X -= 1
                Case 3
                    Feld.Y -= 1
                    Feld.X -= 1
            End Select
            If Feld.X >= 0 And Feld.X < Spielfeld.Breite And Feld.Y >= 0 And Feld.Y < Spielfeld.Höhe Then
                If IsNothing(Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap)) = False Then
                    If Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).Spieler = Spielfeld.AktuelleEinheit.Spieler Then
                        Return True
                    End If
                End If
            End If
        Next
        Return False
    End Function
    Public Shared Function KannRaketeZünden() As Boolean
        If Spielfeld.AktuelleEinheit.KannBesetzen = True Then
            Dim X As Integer
            Dim Y As Integer
            If IsNothing(Spielfeld.Laufen) Then
                X = Spielfeld.AktuelleEinheitPosition.X : Y = Spielfeld.AktuelleEinheitPosition.Y
            Else
                X = Spielfeld.Laufen.Position.X : Y = Spielfeld.Laufen.Position.Y
            End If
            If IsNothing(Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebäude) = False Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebäude.Angriff = ObjektGebäude.Angriffe.Silo Then
                    Return True
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function KannZuKOAufwerten() As Boolean
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.CommanderWars2
                If Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).KOS(0).GetKOEinheit Is Nothing Then
                    Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
                    Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
                    If IsNothing(Spielfeld.Laufen) = False Then
                        XPosition = Spielfeld.Laufen.Position.X
                        YPosition = Spielfeld.Laufen.Position.Y
                    End If
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(XPosition, YPosition, Spielfeld.MomentaneSchlacht).Gebäude
                    If Spielfeld.AktuelleEinheit.Kosten / 2 <= Spielfeld.AktuellerSpieler.Fonds Then
                        If Not G Is Nothing Then
                            If G.GetSpieler.Team = Spielfeld.AktuellerSpieler.Team Then
                                If G.GetBaulisteThisPlayer.Length > 0 Or G.Angriff = ObjektGebäude.Angriffe.HQ Then
                                    Return True
                                End If
                            End If
                        End If
                    End If
                End If
        End Select
        Return False
    End Function
    Public Shared Function CanBuildTempBase() As Boolean
        If Spielfeld.AktuelleEinheit.Munition > 0 Then
            If Spielfeld.AktuelleEinheit.HasMaterial Then
                Dim Pos As Point
                If Spielfeld.Laufen Is Nothing Then
                    Pos = New Point(Spielfeld.AktuelleEinheit.X, Spielfeld.AktuelleEinheit.Y)
                Else
                    Pos = Spielfeld.Laufen.Position
                End If
                Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(Pos.X, Pos.Y, Spielfeld.AktuelleEinheit.GetMap)
                Select Case L.getID.ToUpper
                    Case "EBENE", "SCHNEE", "WÜSTE", "STRAND"
                        Return True
                End Select
            End If
        End If
        Return False
    End Function
#End Region
#Region "Ins Nichts Menü"
    Public Shared Sub AuswahlMenüerschaffen()
        Spielfeld.AktuelleEinheitPosition = New Point(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y)
        Dim Symbolen As New Stack(Of Texture)
        Dim Namen As New Stack(Of String)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            addMenüitem("Schlacht Wechsel", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\SchlachtWechsel.png"), Symbolen, Namen)
        End If
        If Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
            If Spielfeld.AktuellerSpieler.KannGabe Then
                addMenüitem("Gabe", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Gabe.png"), Symbolen, Namen)
                If Spielfeld.AktuellerSpieler.KannSpezialGabe Then
                    addMenüitem("Spezialgabe", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Spezialgabe.png"), Symbolen, Namen)
                    If Spielfeld.AktuellerSpieler.KannDoppelGabe Then
                        addMenüitem("Doppelgabe", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Doppelgabe.png"), Symbolen, Namen)
                    End If
                End If
            ElseIf Spielfeld.AktuellerSpieler.KannSpezialGabe Then
                addMenüitem("Spezialgabe", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Spezialgabe.png"), Symbolen, Namen)
                If Spielfeld.AktuellerSpieler.KannDoppelGabe Then
                    addMenüitem("Doppelgabe", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Doppelgabe.png"), Symbolen, Namen)
                End If
            End If
        End If
        addMenüitem("KO", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\KO.png"), Symbolen, Namen)
        addMenüitem("Abzug", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Abziehen.png"), Symbolen, Namen)
        addMenüitem("Musik", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Musik.png"), Symbolen, Namen)
        addMenüitem("Speichern", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Speichern.png"), Symbolen, Namen)
        addMenüitem("Beenden", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Beenden.png"), Symbolen, Namen)
        If Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
            If Spielfeld.AktuellerSpieler.KOS(1).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                addMenüitem("Nächster Spieler", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Nächster Spieler.png"), Symbolen, Namen)
            Else
                addMenüitem("Wechsel", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Wechsel.png"), Symbolen, Namen)
            End If
        Else
            addMenüitem("Nächster Spieler", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Nächster Spieler.png"), Symbolen, Namen)
            If IsNothing(Spielfeld.AktuellerSpieler.KOS(1)) = False Then
                addMenüitem("Wechsel", Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Wechsel.png"), Symbolen, Namen)
            End If
        End If


        EinheitenMenü = New ObjektEinheitenmenü(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes)
    End Sub
#End Region
#End Region
    Public Shared Sub Einheitauswählen(ByVal X As Integer, ByVal Y As Integer, Optional ByVal WSS As Wegsuchsystem = Nothing)
        'Bevor wir diese Einheit auswählen und uns mal wieder mit warten verklicken, weil wir die Maus benutzen, speichern wir lieber mal ab, damit wir später mit Strg+Z rückgängig machen könne, was wir rückgängig machen wollen.
        autospeichern()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        If IsNothing(Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)) = False Then
            If Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                SelectUnit(X, Y, WSS, M)
            ElseIf Not Objektverwalter.Spielfeld.KI Is Nothing Then
                If Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                    SelectUnit(X, Y, WSS, M)
                End If
            End If
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Private Shared Sub SelectUnit(ByVal X As Integer, ByVal Y As Integer, ByVal WSS As Wegsuchsystem, ByVal M As ObjektSpielMenü)
        If Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Spielfeld.AktuelleEinheitPfeil = New ObjektPfeil()
        End If
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Einheitausgewählt
        Spielfeld.AktuelleEinheit = Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)
        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
        Dim Bewegunspunkte As Integer = Spielfeld.AktuelleEinheit.GetMovementRange
        If WSS Is Nothing Then
            If Bewegunspunkte <= Spielfeld.AktuelleEinheit.Treibstoff Then
                Spielfeld.Wegsuchsystem = New Wegsuchsystem(Spielfeld.AktuelleEinheit, X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
            ElseIf Spielfeld.AktuelleEinheit.Treibstoff = -1 Then
                Spielfeld.Wegsuchsystem = New Wegsuchsystem(Spielfeld.AktuelleEinheit, X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
            Else
                Spielfeld.Wegsuchsystem = New Wegsuchsystem(Spielfeld.AktuelleEinheit, X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Spielfeld.AktuelleEinheit.Treibstoff)
            End If
        Else
            Spielfeld.Wegsuchsystem = WSS
        End If
        If Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            For X = 0 To Spielfeld.Breite - 1
                For Y = 0 To Spielfeld.Höhe - 1
                    If Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) >= 0 Then
                        If Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) <= Bewegunspunkte Then
                            neuMarkiertesFeld(X, Y, Color.FromArgb(150, 255, 255, 255))
                        ElseIf Spielfeld.Wegsuchsystem.GetBewegungspunktekostenReal(X, Y, Spielfeld.AktuelleEinheit.GetMap) <= Bewegunspunkte Then
                            Dim E As ObjektEinheit = Spielfeld.Einheiten(X, Y, Spielfeld.AktuelleEinheit.GetMap)
                            If E IsNot Nothing Then
                                If E.GetSpieler.Team = Spielfeld.AktuellerSpieler.Team Then
                                    neuMarkiertesFeld(X, Y, Color.FromArgb(150, 255, 255, 255))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
            MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Einheitausgewählt.wav", False)
        End If
    End Sub
    ''' <summary>
    ''' Wenn momentan eine Einheit ausgewählt ist wird sie abgewählt
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Einheitabwählen(Optional ByVal OhneSound As Boolean = False)
        If Spielfeld.AktuelleEinheitHatGefeuert = True Then
            Warten()
        Else
            If IsNothing(Spielfeld.Laufen) Then
                MarkierteFelder.Clear()
                Spielfeld.AktuelleEinheit = Nothing
                Spielfeld.AktuelleEinheitPosition = Nothing
                Spielfeld.Wegsuchsystem = Nothing
                Spielfeld.AktuelleEinheitPfeil = Nothing
                Dim M As ObjektSpielMenü = Objektverwalter.Menü
                M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
            Else
                Spielfeld.LaufenLöschen = True
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
                Spielfeld.Laufen.Position = Spielfeld.AktuelleEinheitPosition
                Einheitauswählen(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            End If
            If Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch And OhneSound = False Then
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Abrechen.wav", False)
            End If
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Führt einen Angriff aus 
    ''' </summary>
    ''' <param name="Angreifer"></param>
    ''' <param name="VerteidigerX"></param>
    ''' <param name="VerteidigerY"></param>
    ''' <remarks></remarks>
    Public Shared Sub Angriff(ByVal Angreifer As ObjektEinheit, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer)
        Dim Fernkampf As Boolean = False
        Dim Verteidiger As ObjektEinheit = Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Angreifer.GetMap)
        Dim X As Integer = -1
        Dim Y As Integer = -1
        If IsNothing(Spielfeld.Laufen) Then
            X = Angreifer.X
            Y = Angreifer.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        If Math.Abs(X - VerteidigerX) + Math.Abs(Y - VerteidigerY) > 1 Then
            Fernkampf = True
        End If
        Dim AngreiferLeben As Single = Angreifer.Leben
        Dim VerteidigerLeben As Single = 0
        If IsNothing(Verteidiger) = False Then
            VerteidigerLeben = Verteidiger.Leben
        End If
        Dim AngreiferSchaden() As Single = Schadensberechnung(Angreifer, X, Y, VerteidigerX, VerteidigerY, AngreiferLeben, VerteidigerLeben, True)
        Dim VerteidigerSchaden() As Single = {-1, -1}
        If IsNothing(Verteidiger) = False Then
            If VerteidigerLeben > 0 And Fernkampf = False Then
                VerteidigerSchaden = Schadensberechnung(Verteidiger, Verteidiger.X, VerteidigerY, X, Y, VerteidigerLeben, AngreiferLeben)
            End If
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Angriff
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Angreifer.X}
                Befehl.WegY = New Integer() {Angreifer.Y}
            End If
            Befehl.OpferX = VerteidigerX
            Befehl.OpferY = VerteidigerY
            Befehl.AngreiferSchaden = AngreiferSchaden(0)
            Befehl.Verteidigerschaden = VerteidigerSchaden(0)
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.Angriff = New ObjektAngriff(X, Y, Spielfeld.Landschaften(X, Y, Angreifer.GetMap), VerteidigerX, VerteidigerY, Fernkampf, AngreiferSchaden, VerteidigerSchaden)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If

    End Sub
    ''' <summary>
    ''' Führt einen Angriff aus 
    ''' </summary>
    ''' <param name="Angreifer"></param>
    ''' <param name="VerteidigerX"></param>
    ''' <param name="VerteidigerY"></param>
    ''' <remarks></remarks>
    Public Shared Sub Angriff(ByVal Angreifer As ObjektEinheit, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer, ByVal AngreiferSchaden As Single, ByVal VerteidigerSchaden As Single)
        Dim Fernkampf As Boolean = False
        Dim Verteidiger As ObjektEinheit = Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Angreifer.GetMap)
        Dim X As Integer = -1
        Dim Y As Integer = -1
        If IsNothing(Spielfeld.Laufen) Then
            X = Spielfeld.AktuelleEinheitPosition.X
            Y = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        If Math.Abs(X - VerteidigerX) + Math.Abs(Y - VerteidigerY) > 1 Then
            Fernkampf = True
        End If
        Dim AngreiferLeben As Single = Angreifer.Leben
        Dim VerteidigerLeben As Single = 0
        If IsNothing(Verteidiger) = False Then
            VerteidigerLeben = Verteidiger.Leben
        End If
        Dim AngreiferSchaden1() As Single = Schadensberechnung(Angreifer, X, Y, VerteidigerX, VerteidigerY, AngreiferLeben, VerteidigerLeben, True)
        Dim VerteidigerSchaden1() As Single = {-1, -1}
        If IsNothing(Verteidiger) = False Then
            If VerteidigerLeben > 0 And Fernkampf = False Then
                VerteidigerSchaden1 = Schadensberechnung(Verteidiger, Verteidiger.X, VerteidigerY, X, Y, VerteidigerLeben, AngreiferLeben)
            End If
        End If
        AngreiferSchaden1(0) = AngreiferSchaden
        VerteidigerSchaden1(0) = VerteidigerSchaden

        Spielfeld.Angriff = New ObjektAngriff(X, Y, Spielfeld.Landschaften(X, Y, Angreifer.GetMap), VerteidigerX, VerteidigerY, Fernkampf, AngreiferSchaden1, VerteidigerSchaden1)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub LechtraketeAbfeuern(ByVal X As Integer, ByVal Y As Integer)
        Dim X1 As Integer = -1
        Dim Y1 As Integer = -1
        If IsNothing(Spielfeld.Laufen) Then
            X1 = Spielfeld.AktuelleEinheit.X
            Y1 = Spielfeld.AktuelleEinheit.Y
        Else
            X1 = Spielfeld.Laufen.Position.X
            Y1 = Spielfeld.Laufen.Position.Y
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Angriff
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {X1}
                Befehl.WegY = New Integer() {Y1}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Array.Resize(Spielfeld.AktuellerSpieler.Sichtfelder, Spielfeld.AktuellerSpieler.Sichtfelder.Length + 1)
        Spielfeld.AktuellerSpieler.Sichtfelder(Spielfeld.AktuellerSpieler.Sichtfelder.Length - 1) = New Vector4(X, Y, Spielfeld.MomentaneSchlacht, 2)
        MarkierteFelder.Clear()
        Warten()
    End Sub
    ''' <summary>
    ''' Berechnet den Schaden der mit einem bestimmten Lebens Anteil verursacht wird und gibt das Leben von Angreifer und Verteidiger zurück
    ''' </summary>
    ''' <param name="Angreifer"></param>
    ''' <param name="AngreiferX"></param>
    ''' <param name="AngreiferY"></param>
    ''' <param name="VerteidigerX"></param>
    ''' <param name="Verteidigery"></param>
    ''' <param name="AngreiferLeben"></param>
    ''' <param name="VerteidigerLeben"></param>
    ''' <param name="MitAngreiferGlück"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Schadensberechnung(ByVal Angreifer As ObjektEinheit, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer, ByRef AngreiferLeben As Single, ByRef VerteidigerLeben As Single, Optional ByVal MitAngreiferGlück As Boolean = False, Optional ByVal AngreiferGlück As Integer = -999, Optional ByVal Verteidiger As ObjektEinheit = Nothing, Optional ByVal VirtualDistance As Boolean = False) As Single()
        Dim Schaden() As Single = {-1, -1}
        'Nur unsere Infanterie kann angreifen
        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeränderteWerte.KeinAngriffaußerINF = True Then
            If Not Angreifer.KannBesetzen = True Then
                'Hm das ist ein Panzer blöd gelaufen.
                Return Schaden
            End If
        End If
        Dim Fernkampf As Boolean = False
        If IsNothing(Verteidiger) Then
            Verteidiger = Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Angreifer.GetMap)
        End If
        If Not VirtualDistance Then
            If Math.Abs(AngreiferX - VerteidigerX) + Math.Abs(AngreiferY - VerteidigerY) > 1 Then
                Fernkampf = True
            End If
        End If
        'Falls dies ein Rückangriff ist kann es sein das der Verteidiger sich bewegt hat und nicht ausgewählt werden kann,
        'er ist aber die Aktuelle Einheit
        If IsNothing(Verteidiger) Then
            If IsNothing(Spielfeld.Laufen) Then
                If VerteidigerX = Spielfeld.AktuelleEinheitPosition.X And VerteidigerY = Spielfeld.AktuelleEinheitPosition.Y Then
                    Verteidiger = Spielfeld.AktuelleEinheit
                    'Hey der wir sind gegen Gegenschaden immun voll fett
                    If Verteidiger.GetSpieler.KOS(0).IsInKOZone(Verteidiger) Then
                        If Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinGegenSchaden = True Then
                            Return Schaden
                        End If
                    End If
                ElseIf IsNothing(Spielfeld.KI) = False Then
                    'Die KI zieht das heißt die ausgewählte Einheit steht noch am Ausgangspunkt
                    If Not Spielfeld.AktuelleEinheit Is Nothing Then
                        If Not Angreifer.Equals(Spielfeld.AktuelleEinheit) Then
                            Verteidiger = Spielfeld.AktuelleEinheit
                        End If
                    End If
                    If Verteidiger Is Nothing Then
                        If Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude Is Nothing Then
                            If Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben > 0 Then
                            Else
                                Return Schaden
                            End If
                        ElseIf Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.KP > 0 Then
                            'Wir machen nichts
                        Else
                            Return Schaden
                        End If
                    Else
                        If Verteidiger.GetSpieler.KOS(0).IsInKOZone(Verteidiger) Then
                            If Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinGegenSchaden = True Then
                                'Hey der wir sind gegen Gegenschaden immun voll fett
                                Return Schaden
                            End If
                        End If
                    End If
                End If
            Else
                If VerteidigerX = Spielfeld.Laufen.Position.X And VerteidigerY = Spielfeld.Laufen.Position.Y Then
                    Verteidiger = Spielfeld.AktuelleEinheit
                    If Verteidiger.GetSpieler.KOS(0).IsInKOZone(Verteidiger) Then
                        'Hey der wir sind gegen Gegenschaden immun voll fett
                        If Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinGegenSchaden = True Then
                            Return Schaden
                        End If
                    End If
                End If
            End If
        Else
            'Wir wollen den Gegner angreifen.
            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinAngriffmitBilligerenTruppen = True Then
                'Der KO hat die Fähigkeit nur von teueren Truppen angegriffen zu werden. 
                If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                    If Angreifer.Kosten < Verteidiger.Kosten Then
                        'Sie ist billiger kein Angriff möglich.=)
                        Return Schaden
                    End If
                End If
            End If
        End If
        If IsNothing(Verteidiger) = False Then
            'Wir greifen eine Einheit an.
            'Falls der Verteidiger getarnt ist kann er eventuell gar nicht angegriffen werden

            If Verteidiger.Sichtbar = False Then
                If Angreifer.Bewegungsart = Verteidiger.Bewegungsart Then
                    If Angreifer.Waffe1 = "Keine" Then
                        If Not Angreifer.Waffe2 = "Keine" Then
                            If Angreifer.MinimaleReichweite > 1 Then
                                'Die Einheit kann den Verteidiger nicht Angreifen, weil sie Getarnt ist
                                Return Schaden
                            End If
                        End If
                    End If
                Else
                    'Die Einheit kann nicht angreifen weil der Verteidiger getarnt ist
                    Return Schaden
                End If
            End If
            'Wir laden wenn möglich die erste Waffe
            Dim Waffe1 As Boolean = False
            If Not Angreifer.Waffe1 = "Keine" And Fernkampf = False Then
                Waffe1 = True
            End If
            'wir laden eventuell die zweite Waffe
            Dim Waffe2 As Boolean = False
            If Angreifer.Munition > 0 Then
                If Fernkampf = True Then
                    Waffe2 = True
                Else
                    If Angreifer.MinimaleReichweite = 1 Then
                        Waffe2 = True
                    End If
                End If
            End If
            'Die Einheit kann nicht Angreifen, weil sie keine Waffe besitzt
            If Waffe1 = False And Waffe2 = False Then Return Schaden
            'Wir schauen ob mit der Waffe 1 angegriffen werden kann und setzen den Schaden fest
            If Waffe1 = True Then
                Schaden(0) = Tabellenverwalter.GetWert(Angreifer.Waffe1, Verteidiger.EinheitenID)
                Schaden(1) = 1
            End If
            'Wir schauen ob mit der Waffe 2 angegriffen werden kann und ,ob der Schaden größer ist als der der Waffe 1 und legen ihn dann gegebenenfalls fest
            If Waffe2 = True Then
                Dim Schaden1 = Tabellenverwalter.GetWert(Angreifer.Waffe2, Verteidiger.EinheitenID)
                If Schaden1 > Schaden(0) Then
                    Schaden(0) = Schaden1
                    Schaden(1) = 2
                    'A Virtual Attack, an Indirect Attack is stronger. No counter attack
                    If VirtualDistance Then
                        If Angreifer.MaximaleReichweite > 1 Then
                            Fernkampf = True
                        End If
                    End If
                End If
            End If
            'Wir wissen jetzt welchen Schaden wir anrichten
            If Schaden(0) >= 0 Then
                'wir holen uns die Angriffsstärke des Angreifers
                Dim Offensivstärke As Integer = (Spielfeld.Spieler(Angreifer.Spieler).GetOffensivStärke(Angreifer, Spielfeld.Landschaften(AngreiferX, AngreiferY, Angreifer.GetMap), Verteidiger.X, Verteidiger.Y, AngreiferLeben, VerteidigerLeben))
                'Falls die Einheit extremstark ist es sind voll  Schäden auf 1 zusetzen die gleich 0 sind
                If Schaden(0) = 0 And Offensivstärke > 150 Then
                    Schaden(0) = 1
                End If
                If My.Settings.CommanderWarsGameMoodus >= CommanderWarsGameModi.CommanderWars Then
                    Dim KP As Integer = getKP(AngreiferLeben)
                    If Angreifer.GetSpieler.KOS(0).Kampfverstärker > 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            KP += Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstärker
                        End If
                    End If
                    If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                            'Das ist die neue Formel für den Schaden aus DC
                            Schaden(0) = (KP / 10) * (Schaden(0)) * (Offensivstärke) / (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStärke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf))
                        Else
                            'Das ist die neue Formel für den Schaden aus DC
                            Schaden(0) = (Schaden(0)) * (Offensivstärke) / (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStärke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf))
                        End If
                    Else
                        'Das ist die neue Formel für den Schaden aus DC
                        Schaden(0) = (KP / 10) * (Schaden(0)) * (Offensivstärke) / (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStärke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf))
                    End If
                Else 'Die Formel aus AW2 oder AW DS
                    'der Schaden wird um die Offensivstärke erhöht
                    Schaden(0) = (Schaden(0) / 100) * Offensivstärke
                    'der Schaden wird eventuell wegen einer beschädigten Einheit reduziert
                    Dim KP As Integer = getKP(AngreiferLeben)


                    If Angreifer.GetSpieler.KOS(0).Kampfverstärker > 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            KP += Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstärker
                        End If

                    End If

                    If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                            Schaden(0) = (Schaden(0) / 10) * KP
                        End If
                    Else
                        Schaden(0) = (Schaden(0) / 10) * KP
                    End If


                    'dieser Schaden wird jetzt evtl reduziert je nach deffensiv Stärke des Gegners
                    Schaden(0) -= Schaden(0) / 100 * (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStärke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf) - 100)
                    'Falls wir einen DoppelAngriff machen können tun wir das jetzt
                    If Spielfeld.Spieler(Angreifer.Spieler).KOS(0).DoppelAngriff > 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            Schaden(0) += Schaden(0) * Spielfeld.Spieler(Angreifer.Spieler).KOS(0).DoppelAngriff
                        End If
                    End If
                    If AngreiferLeben - VerteidigerLeben > 50 Then
                        'Die Einheit hat erheblich mehr KP und macht deshalb ein Zentel mehr Schaden
                        Schaden(0) += Schaden(0) / 10
                    End If
                End If
                'Jetzt wird eventuell das Glück dazu addiert
                Dim Glück As Integer = 0
                Dim Pech As Integer = 0
                If AngreiferGlück = -999 Then
                    If MitAngreiferGlück = True Then
                        Dim GP As Point = Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).GetGlückPech(AngreiferX, AngreiferY)
                        Glück = GP.X
                        Pech = GP.Y
                        'Manche KOs haben Max Glück wenn der Gegner zerstört würde.
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ImmerMaxGlück = True Then
                            If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                                Pech = Glück
                            End If
                        ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).MaxGlückbeiZerstörung = True Then
                            If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                                If VerteidigerLeben - Schaden(0) - Glück <= 0 Then
                                    'Mit Max Glück ist sie tod dann haben wir das. Pech gehabt
                                    Pech = Glück
                                End If
                            End If
                        End If
                    End If
                Else
                    Glück = AngreiferGlück
                    Pech = AngreiferGlück
                End If
                Schaden(0) += Zufallszahl(Pech, Glück)
                'Manche KOs haben die Fähigkeit eigen Schaden nochmals auf den Gegner zurückzuwerfen, dass machen wir jetzt
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ErhöhterGegenschadenbeiEigenSchaden <> 0 Then
                    If Angreifer.Leben - AngreiferLeben > 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            Schaden(0) += (Angreifer.Leben - AngreiferLeben) * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ErhöhterGegenschadenbeiEigenSchaden
                        End If
                    End If
                End If
                'Manche KOs richten mit jeder Einheit 5% mehr Schaden aus oder so. Sehr unfair.
                Schaden(0) += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).FesterZusatzschadenUndDeffensive.X
                Schaden(0) -= Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).FesterZusatzschadenUndDeffensive.Y
                'Falls der Schaden wegen übermäßigen Pech kleiner  ist wird er auf Null gesetzt oder anderen Dingen
                If Schaden(0) < 0 Then
                    Schaden(0) = 0
                End If
                'Falls der KO des Angreifers eine Lebensentzug Fähigkeit besitzt geben wir das zurück
                'Die Einheit kann nur einen gewissen Schaden erleiden und wir sind evtl. trüber.
                If VerteidigerLeben - Schaden(0) < Verteidiger.KP * Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Maximalschaden And Not Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Maximalschaden <= 0 Then
                    'Dann wird der Schaden auf das Maximum gesetzt
                    If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                        Schaden(0) = VerteidigerLeben - Verteidiger.KP * Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Maximalschaden
                    End If
                End If
                'Das Opferleben wird gesenkt und ebenfalls zurück gegeben
                VerteidigerLeben -= Schaden(0)
            End If
        ElseIf IsNothing(Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Angreifer.GetMap).Gebäude) = False Then
            'wir greifen ein Gebäude an!
            Dim Gebäude As ObjektGebäude = Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Angreifer.GetMap).Gebäude
            'wir schauen ob mit der Waffe 1 angegriffen werden kann
            Dim Waffe1 As Boolean = False
            If Not Angreifer.Waffe1 = "Keine" Then
                Waffe1 = True
            End If
            'wir schauen ob mit der Waffe 2 angegriffen werden kann
            Dim Waffe2 As Boolean = False
            If Angreifer.Munition > 0 Then
                If Fernkampf = True Then
                    Waffe2 = True
                Else
                    If Angreifer.MinimaleReichweite = 1 Then
                        Waffe2 = True
                    End If
                End If
            End If
            'wir wählen die Waffe 1 aus und legen den Schaden fest
            If Waffe1 = False And Waffe2 = False Then Return Schaden
            If Waffe1 = True Then
                Schaden(0) = Tabellenverwalter.GetWert(Angreifer.Waffe1, "Gebäude")
                Schaden(1) = 1
            End If
            'Falls der Schaden der 2 Waffe größer ist wird diese ausgewählt
            If Waffe2 = True Then
                Dim Schaden1 = Tabellenverwalter.GetWert(Angreifer.Waffe2, "Gebäude")
                If Schaden1 > Schaden(0) Then
                    Schaden(0) = Schaden1
                    Schaden(1) = 2
                End If
            End If
            If Schaden(0) >= 0 Then
                'wir erhöhen den Schaden je nach KO Stärken
                Schaden(0) = Schaden(0) / 100 * Spielfeld.Spieler(Angreifer.Spieler).GetOffensivStärke(Angreifer, Spielfeld.Landschaften(AngreiferX, AngreiferY, Angreifer.GetMap), -1, -1, -1, -1)
                'Der Schaden wird je nach Leben der Einheit gesenkt

                Dim KP As Integer = getKP(AngreiferLeben)
                If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                    If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                        KP += Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstärker
                    Else
                        KP = 10
                    End If
                End If
                Schaden(0) = Schaden(0) / 10 * KP
            End If
        ElseIf Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Angreifer.GetMap).Leben > 0 Then
            'wir greifen ein Gebäude an!

            'wir schauen ob mit der Waffe 1 angegriffen werden kann
            Dim Waffe1 As Boolean = False
            If Not Angreifer.Waffe1 = "Keine" Then
                Waffe1 = True
            End If
            'wir schauen ob mit der Waffe 2 angegriffen werden kann
            Dim Waffe2 As Boolean = False
            If Angreifer.Munition > 0 Then
                If Fernkampf = True Then
                    Waffe2 = True
                Else
                    If Angreifer.MinimaleReichweite = 1 Then
                        Waffe2 = True
                    End If
                End If
            End If
            'wir wählen die Waffe 1 aus und legen den Schaden fest
            If Waffe1 = False And Waffe2 = False Then Return Schaden
            If Waffe1 = True Then
                Schaden(0) = Tabellenverwalter.GetWert(Angreifer.Waffe1, "Gebäude")
                Schaden(1) = 1
            End If
            'Falls der Schaden der 2 Waffe größer ist wird diese ausgewählt
            If Waffe2 = True Then
                Dim Schaden1 = Tabellenverwalter.GetWert(Angreifer.Waffe2, "Gebäude")
                If Schaden1 > Schaden(0) Then
                    Schaden(0) = Schaden1
                    Schaden(1) = 2
                End If
            End If
            If Schaden(0) >= 0 Then
                'wir erhöhen den Schaden je nach KO Stärken
                Schaden(0) = Schaden(0) / 100 * Spielfeld.Spieler(Angreifer.Spieler).GetOffensivStärke(Angreifer, Spielfeld.Landschaften(AngreiferX, AngreiferY, Angreifer.GetMap), -1, -1, -1, -1)
                'Der Schaden wird je nach Leben der Einheit gesenkt
                If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                    If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                        Schaden(0) = Schaden(0) / 10 * (getKP(AngreiferLeben) + Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstärker)
                    Else
                        Schaden(0) = Schaden(0) * (getKP(AngreiferLeben) + Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstärker)
                    End If
                Else
                    Schaden(0) = Schaden(0) / 10 * (getKP(AngreiferLeben) + Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstärker)
                End If
            End If
        Else
            Schaden(0) = -1
            Schaden(1) = -1
        End If
        Return Schaden
    End Function
    ''' <summary>
    ''' Lässt die ausgewählte Einheit warten
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Warten()
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            If Spielfeld.AktuelleEinheit.MaximaleReichweite > 1 Then
                If IsNothing(Spielfeld.Laufen) Then
                    'Es ist eine Fernkampf Einheit
                    If Spielfeld.AktuellerSpieler.KOS(0).FireandMove = True Then
                        If Spielfeld.AktuelleEinheitHatGefeuert = False Then
                            Spielfeld.AktuelleEinheitHatGefeuert = True
                            Einheitauswählen(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
                            Exit Sub
                        End If
                    End If
                End If
            End If
            'Wenn wir ein Netzwerkspiel haben, muss das auch gesendet werden.

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As KIPassivNetzwerk.Befehl
                Befehl.Befehl = ObjektKI.KIModiExtern.Warten
                Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                    Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                Else
                    Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                    Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                End If
                Befehl.OpferX = Befehl.WegX(0)
                Befehl.OpferY = Befehl.WegY(0)
                Befehl.AngreiferSchaden = -1
                Befehl.Verteidigerschaden = -1
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenü.NetzBefehlSenden(Befehl)
            End If

            'Wir legen die Feldtarnung fest.

            If Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX.Length - 1 <= Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite Then
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite >= 0 Then
                    Dim X1 As Integer = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                    Dim Y1 As Integer = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                    If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                        X1 = Objektverwalter.Spielfeld.Laufen.Position.X
                        Y1 = Objektverwalter.Spielfeld.Laufen.Position.Y
                    End If
                    If Spielfeld.AktuellerSpieler.KOS(0).IsInKOZone(X1, Y1) Then
                        Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(True)
                    Else
                        Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
                    End If
                Else
                    Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
                End If
            Else
                Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
            End If
            If IsNothing(Spielfeld.Laufen) Then
                MarkierteFelder.Clear()
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
                Hauptmenü.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenü.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenü.Feldbreite)
            Else
                If Spielfeld.AktuelleEinheit.Besetzen = True Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude) = False Then
                        If Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung > 0 Then
                            If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebäude) Then
                                Spielfeld.AktuelleEinheit.Besetzen = False
                                Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung = 20
                            Else
                                Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung = 20
                            End If
                        End If
                    Else
                        If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                            Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                            TTP.StopBuildTempBase()
                        End If
                    End If
                End If



                If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                    Else
                        Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                    End If
                End If

                If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Höllium.ToString Then
                    If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                        NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                    End If
                End If
                Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
                Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
                Hauptmenü.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenü.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenü.Feldbreite)
                Spielfeld.LaufenLöschen = True
            End If

            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
        End If
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Lässt eine Einheit warten ohne sie auf Bewegt zu setzen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub WartenOhneHatSichBewegt()
        If IsNothing(Spielfeld.Laufen) Then
            MarkierteFelder.Clear()
            Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenü.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenü.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenü.Feldbreite)
        Else
            If Spielfeld.AktuelleEinheit.Besetzen = True Then
                If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude) = False Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebäude) Then
                        Spielfeld.AktuelleEinheit.Besetzen = False
                        Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung = 20
                    Else
                        Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung = 20
                    End If
                Else
                    If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                        Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                        TTP.StopBuildTempBase()
                    End If
                End If
            End If
            If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                Else
                    Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                End If
            End If
            If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Höllium.tostring Then
                If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                    NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                End If
            End If
            Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
            Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
            Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenü.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenü.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenü.Feldbreite)
            Spielfeld.LaufenLöschen = True
        End If

        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        Spielfeld.AktuelleEinheitHatGefeuert = False
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Lässt die ausgewählte Einheit warten und schickt sie auf das andere Schlachtfeld
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Schicken()
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            'Wenn wir ein Netzwerkspiel haben, muss das auch gesendet werden.

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As KIPassivNetzwerk.Befehl
                Befehl.Befehl = ObjektKI.KIModiExtern.EinheitSchicken
                Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                    Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                Else
                    Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                    Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                End If
                Befehl.OpferX = Befehl.WegX(0)
                Befehl.OpferY = Befehl.WegY(0)
                Befehl.AngreiferSchaden = -1
                Befehl.Verteidigerschaden = -1
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenü.NetzBefehlSenden(Befehl)
            End If

            'Wir legen die Feldtarnung fest.

            If Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX.Length - 1 <= Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite Then
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite >= 0 Then
                    Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(True)
                Else
                    Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
                End If
            Else
                Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
            End If
            If IsNothing(Spielfeld.Laufen) Then
                MarkierteFelder.Clear()
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Dim Map As Integer = Spielfeld.AktuelleEinheit.GetSendeMap
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.AktuelleEinheit.GetMap) = Nothing
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Map) = Spielfeld.AktuelleEinheit
                Hauptmenü.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenü.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenü.Feldbreite)
            Else
                If Spielfeld.AktuelleEinheit.Besetzen = True Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude) = False Then
                        If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebäude) Then
                            Spielfeld.AktuelleEinheit.Besetzen = False
                            Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung = 20
                        Else
                            Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzung = 20
                        End If
                    End If
                End If
                If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                    Else
                        Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                    End If
                End If
                If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Höllium.ToString Then
                    If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                        NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                    End If
                End If
                Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
                Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetSendeMap) = Spielfeld.AktuelleEinheit
                Hauptmenü.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenü.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenü.Feldbreite)
                Spielfeld.LaufenLöschen = True
            End If

            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
        End If
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Besetzen()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Besetzen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        If IsNothing(Spielfeld.Laufen) Then
            Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzen(Spielfeld.AktuelleEinheit)
        Else
            Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebäude.Besetzen(Spielfeld.AktuelleEinheit)
        End If
        Warten()
    End Sub
    Public Shared Sub Tarnen()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Tarnen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.AktuelleEinheit.SetTarnung(True)
        Warten()
    End Sub
    Public Shared Sub Auftauchen()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Auftauchen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.AktuelleEinheit.SetTarnung(False)
        Warten()
    End Sub
    Public Shared Sub Fracht()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Fracht
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Dim FrachtEinheit As ObjektEinheit = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)
        Spielfeld.AktuelleEinheit.HatsichBewegt = True
        For I = 0 To FrachtEinheit.Ladung.Length - 1
            If IsNothing(FrachtEinheit.Ladung(I)) Then
                FrachtEinheit.Ladung(I) = Spielfeld.AktuelleEinheit
                Exit For
            End If
        Next
        Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = FrachtEinheit
        Spielfeld.LaufenLöschen = True
        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Geladen.wav", False)
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Angriffanzeigen()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Angriff
        MarkierteFelder.Clear()
        Dim MaximalReichweite As Integer = -1
        Dim Kreis(,) As Integer
        Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
        Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
        If IsNothing(Spielfeld.Laufen) = False Then
            XPosition = Spielfeld.Laufen.Position.X
            YPosition = Spielfeld.Laufen.Position.Y
        End If
        MaximalReichweite = Spielfeld.AktuelleEinheit.MaximaleReichweite

        Kreis = Kreisfunktion(MaximalReichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= Spielfeld.AktuelleEinheit.MinimaleReichweite Then
                    Dim Fernkampf As Boolean = False
                    If Kreis(X, Y) > 1 Then
                        Fernkampf = True
                    End If
                    If KannAngreifen(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, XPosition, YPosition, Fernkampf, Spielfeld.AktuelleEinheit.GetMap) Then
                        neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                    End If
                ElseIf Not Spielfeld.AktuelleEinheit.Waffe1 = "Keine" And Kreis(X, Y) > 0 Then
                    Dim Fernkampf As Boolean = False
                    If Kreis(X, Y) > 1 Then
                        Fernkampf = True
                    End If
                    If KannAngreifen(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, XPosition, YPosition, Fernkampf, Spielfeld.AktuelleEinheit.GetMap) Then
                        neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                    End If
                ElseIf Kreis(X, Y) = 0 Then
                    'Wir sind eine Lufteinheit
                    If Spielfeld.AktuelleEinheit.GetMap = ObjektSpielfeld.Luftschlacht Then
                        If KannBodenAngriff(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, XPosition, YPosition) Then
                            neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                        End If
                    End If
                End If
            Next
        Next

        Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenü.Feldbreite)
    End Sub
    Public Shared Sub LeuchtraketenZieleAbfeuern()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Leuchtrakete
        MarkierteFelder.Clear()
        Dim MaximalReichweite As Integer = -1
        Dim Kreis(,) As Integer
        Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
        Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
        If IsNothing(Spielfeld.Laufen) = False Then
            XPosition = Spielfeld.Laufen.Position.X
            YPosition = Spielfeld.Laufen.Position.Y
        End If
        MaximalReichweite = Spielfeld.AktuelleEinheit.Reichweitemax
        Kreis = Kreisfunktion(MaximalReichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                End If
            Next
        Next
        Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenü.Feldbreite)
    End Sub
    Public Shared Function KannAngreifen(ByVal X As Integer, ByVal Y As Integer, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer, ByVal Fernkampf As Boolean, ByVal Schlacht As Integer) As Boolean
        Dim Angreifer As ObjektEinheit = Spielfeld.Einheiten(AngreiferX, AngreiferY, Schlacht)
        If IsNothing(Angreifer) Then
            Angreifer = Spielfeld.AktuelleEinheit
        End If
        If X >= 0 And Y >= 0 And X < Spielfeld.Breite And Y < Spielfeld.Höhe Then
            If IsNothing(Spielfeld.Einheiten(X, Y, Angreifer.GetMap)) = False Then
                If Not Spielfeld.Spieler(Spielfeld.Einheiten(X, Y, Angreifer.GetMap).Spieler).Team = Spielfeld.Spieler(Angreifer.Spieler).Team Then
                    If Spielfeld.Einheiten(X, Y, Angreifer.GetMap).Sichtbar = True Then
                        If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100)(0) >= 0 Then
                                Return True
                            End If
                        ElseIf Fernkampf Then
                            If Angreifer.CanIndirectMoveAndFire Then
                                If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100)(0) >= 0 Then
                                    Return True
                                End If
                            End If
                        Else
                            If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100)(0) >= 0 Then
                                Return True
                            End If
                        End If
                    End If
                End If
            ElseIf Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Leben > 0 Then
                If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100)(0) >= 0 Then
                    Return True
                End If
            ElseIf IsNothing(Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebäude) = False Then
                If Spielfeld.Landschaften(Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebäude.Rechteck.X, Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebäude.Rechteck.Y, Angreifer.GetMap).Gebäude.KP > 0 Then
                    If Not Spielfeld.Spieler(Spielfeld.Landschaften(Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebäude.Rechteck.X, Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebäude.Rechteck.Y, Angreifer.GetMap).Gebäude.Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                        If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100)(0) >= 0 Then
                            Return True
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    ''' <summary>
    ''' Überprüft ob eine Lufteinheit in der Luftschlacht einen Feind angreifen kann.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="AngreiferX"></param>
    ''' <param name="AngreiferY"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KannBodenAngriff(ByVal X As Integer, ByVal Y As Integer, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer) As Boolean
        Dim Angreifer As ObjektEinheit = Spielfeld.Einheiten(AngreiferX, AngreiferY, ObjektSpielfeld.Luftschlacht)
        If IsNothing(Angreifer) Then
            Angreifer = Spielfeld.AktuelleEinheit
        End If
        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)
        If Not E Is Nothing Then
            If Not E.IsFlyingUnit Then
                If Not Spielfeld.Spieler(E.Spieler).Team = Spielfeld.Spieler(Angreifer.Spieler).Team Then
                    If E.Sichtbar = True Then
                        If Angreifer.IsAttackable(E, True) Then
                            Return True
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Sub Entladen(ByVal X As Integer, ByVal Y As Integer, ByVal ZuentladendeEinheit As Integer)

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Entladen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = ZuentladendeEinheit
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit.Ladung(ZuentladendeEinheit)
        'Sollte jetzt je nach Version ohne diesen Aufruf funktionieren.
        ' Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).HatsichBewegt = True
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).X = X
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Y = Y
        Spielfeld.AktuelleEinheit.Ladung(ZuentladendeEinheit) = Nothing
        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Entladen.wav", False)
        Dim EinheitGefunden As Boolean = False
        For I = 0 To Spielfeld.AktuelleEinheit.Ladung.Length - 1
            If IsNothing(Spielfeld.AktuelleEinheit.Ladung(I)) Then
                For I2 = I + 1 To Spielfeld.AktuelleEinheit.Ladung.Length - 1
                    If IsNothing(Spielfeld.AktuelleEinheit.Ladung(I2)) = False Then
                        Spielfeld.AktuelleEinheit.Ladung(I) = Spielfeld.AktuelleEinheit.Ladung(I2)
                        Spielfeld.AktuelleEinheit.Ladung(I2) = Nothing
                        EinheitGefunden = True
                        Exit For
                    End If
                Next
            Else
                EinheitGefunden = True
            End If
        Next
        If EinheitGefunden = False Then
            Warten()
        ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Spielfeld.AktuelleEinheitHatGefeuert = True
            Befehlsmenüerschaffen()
        End If
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If

    End Sub
    Public Shared Sub EntladungAnzeigen(ByVal Einheit As Integer)
        Dim X As Integer = 0
        Dim Y As Integer = 0
        If IsNothing(Spielfeld.Laufen) Then
            X = Spielfeld.AktuelleEinheitPosition.X
            Y = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        For I = 0 To 3
            Select Case I
                Case 0
                    Y -= 1
                Case 1
                    Y += 1
                    X += 1
                Case 2
                    Y += 1
                    X -= 1
                Case 3
                    Y -= 1
                    X -= 1
            End Select
            If X >= 0 And X < Spielfeld.Breite And Y >= 0 And Y < Spielfeld.Höhe Then
                If Bewegungskosten(Spielfeld.AktuelleEinheit.Ladung(Einheit), Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).getID, Spielfeld.Regeln.Wetter, X, Y) > 0 And IsNothing(Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)) Then
                    neuMarkiertesFeld(X, Y, Color.FromArgb(160, 255, 255, 255))
                End If
            End If
        Next
        Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenü.Feldbreite)
    End Sub
    Public Shared Sub Ration(ByVal OhneWarten As Boolean, ByRef WarteZeit As Integer, ByVal Schlacht As Integer)

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Ration
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If


        Dim X As Integer = 0
        Dim Y As Integer = 0
        If IsNothing(Spielfeld.Laufen) Then
            X = Spielfeld.AktuelleEinheitPosition.X
            Y = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        Dim Zeit As Integer = WarteZeit
        For I = 0 To 3
            Select Case I
                Case 0
                    Y -= 1
                Case 1
                    Y += 1
                    X += 1
                Case 2
                    Y += 1
                    X -= 1
                Case 3
                    Y -= 1
                    X -= 1
            End Select
            If X >= 0 And X < Spielfeld.Breite And Y >= 0 And Y < Spielfeld.Höhe Then
                If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    If Not Spielfeld.AktuelleEinheit Is Nothing Then
                        If Spielfeld.Einheiten(X, Y, Schlacht).Spieler = Spielfeld.AktuelleEinheit.Spieler Then
                            WarteZeit = Zeit
                            Ration(X, Y, True, WarteZeit, Schlacht)
                        End If
                    Else
                        If Spielfeld.Einheiten(X, Y, Schlacht).Spieler = Spielfeld.AktuellerSpieler.Spieler Then
                            WarteZeit = Zeit
                            Ration(X, Y, True, WarteZeit, Schlacht)
                        End If
                    End If
                End If
            End If
        Next
        If OhneWarten = False Then
            Warten()
        Else
            ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Ration(ByVal X As Integer, ByVal Y As Integer, ByVal MitRationsZeichen As Boolean, ByRef WarteZeit As Integer, ByVal Schlacht As Integer)
        If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
            If MitRationsZeichen = True Then
                If Spielfeld.Landschaften(X, Y, Schlacht).Kriegsnebel = Nebelarten.Aus Then
                    If Not Hauptmenü.Aufzeichnungsspulen Then
                        BackbufferSpiel.AddAnimation("Ration", WarteZeit, New Point(X, Y), True, Schlacht)
                        WarteZeit += ObjektSpielfeld.WarteZeitZwischenAnimationen
                    End If
                End If
            End If
            Spielfeld.Einheiten(X, Y, Schlacht).Treibstoff = Spielfeld.Einheiten(X, Y, Schlacht).SpritMax + 1
            If Not Spielfeld.Einheiten(X, Y, Schlacht).HasMaterial Then
                Spielfeld.Einheiten(X, Y, Schlacht).Munition = Spielfeld.Einheiten(X, Y, Schlacht).MunitionMax + 1
            End If
        End If
    End Sub
    Public Shared Sub Einen()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Einen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Dim KP As Integer = (Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).getKP + Spielfeld.AktuelleEinheit.getKP) * 10
        If KP / 10 > 10 Then
            Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).AddFonds((Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).getKP + Spielfeld.AktuelleEinheit.getKP - 10) * Spielfeld.AktuelleEinheit.Kosten / 10 * Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Teurungsrate(Spielfeld.AktuelleEinheit, Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y))
            KP = 100
        End If
        Dim Treibstoff As Integer = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Treibstoff + Spielfeld.AktuelleEinheit.Treibstoff
        Dim Muni As Integer = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Munition + Spielfeld.AktuelleEinheit.Munition
        Dim Rang As ObjektEinheit.Stufe = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).EinheitenStufe
        If Rang < Spielfeld.AktuelleEinheit.EinheitenStufe Then
            Rang = Spielfeld.AktuelleEinheit.EinheitenStufe
        End If
        Dim COEinheit As Boolean = False
        If Not Spielfeld.AktuellerSpieler.KOS(0).GetKOEinheit Is Nothing Then
            If Spielfeld.AktuelleEinheit.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                COEinheit = True
            ElseIf Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).EinheitenStufe = ObjektEinheit.Stufe.KO Then
                COEinheit = True
            End If
        End If
        Spielfeld.AktuelleEinheit = ObjektLadeklasse.NewEinheit(Spielfeld.AktuelleEinheit.EinheitenID, KP, 0, Muni, Spielfeld.AktuelleEinheit.Spieler, Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Besetzen, Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, False, True)
        Spielfeld.AktuelleEinheit.Munition = Muni
        Spielfeld.AktuelleEinheit.Treibstoff = Treibstoff
        Spielfeld.AktuelleEinheit.TruppenStufe = Rang
        Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Nothing
        If COEinheit Then
            Spielfeld.AktuellerSpieler.KOS(0).SetKOEinheit(Spielfeld.AktuelleEinheit)
        End If
        Warten()
    End Sub
    Public Shared Sub Heilen(ByRef Einheit As ObjektEinheit, Optional ByVal Umsonst As Boolean = False)
        If Umsonst = True Then
            Dim KP As Integer = Einheit.getKP
            If KP + 1 <= 10 Then
                KP += 1
            End If
            Einheit.Leben = (KP) * 10
        Else
            If Einheit.Kosten / 10 * Spielfeld.Spieler(Einheit.Spieler).Teurungsrate(Einheit, Einheit.X, Einheit.Y) * Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeränderteWerte.Reperaturkosten <= Spielfeld.Spieler(Einheit.Spieler).Fonds Then
                Dim KP As Integer = Einheit.getKP
                If KP + 1 <= 10 Then
                    Spielfeld.Spieler(Einheit.Spieler).AddFonds(-Einheit.Kosten / 10 * Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeränderteWerte.Reperaturkosten)
                    KP += 1
                End If
                Einheit.Leben = (KP) * 10
            End If
        End If
    End Sub
    Public Shared Sub EinheitBauen(ByVal Daten() As String, ByVal X As Integer, ByVal Y As Integer, Optional ByVal HatSichBewegt As Boolean = True, Optional ByVal KIBau As Boolean = False)
        If Objektverwalter.Spielfeld.AktuellerSpieler.VeränderteWerte.KeinBau = False Then
            Dim Einheitenname As String = Daten(0)
            If Daten.Length > 2 Then
                For I = 1 To Daten.Length - 2
                    If Not Daten(I) = "" Then
                        Einheitenname += " " + Daten(I)
                    End If
                Next
            End If
            Dim EinheitID As String = ObjektLadeklasse.GetIDFromName(Einheitenname)

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As KIPassivNetzwerk.Befehl
                Befehl.Befehl = ObjektKI.KIModiExtern.EinheitBauen
                Befehl.KooX = X
                Befehl.KooY = Y
                Dim ID As Integer = -1
                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                    If Objektverwalter.AlleEinheiten(I).EinheitenID = EinheitID Then
                        ID = I
                        Exit For
                    End If
                Next
                Befehl.WegX = New Integer() {ID}
                Befehl.WegY = New Integer() {HatSichBewegt}
                Befehl.OpferX = X
                Befehl.OpferY = Y
                Befehl.AngreiferSchaden = -1
                Befehl.Verteidigerschaden = -1
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenü.NetzBefehlSenden(Befehl)
            End If

            If Spielfeld.AktuellerSpieler.KOS(0).IsInKOZone(X, Y) Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).NachBauZiehen = True Then
                    HatSichBewegt = False
                End If
            End If
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht) = ObjektLadeklasse.NewEinheit(EinheitID, Spielfeld.AktuellerSpieler.Spieler, X, Y, HatSichBewegt)
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Sichtbar = False
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).SetKP(Objektverwalter.Spielfeld.AktuellerSpieler.VeränderteWerte.TPBauEinheiten)
            Spielfeld.Regeln.SindBesiegbar()
            'Wir müssen die Einheit bezahlen
            Spielfeld.AktuellerSpieler.AddFonds(-Daten(Daten.Length - 1))
            If KIBau = False Then
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\OK.wav", False)
                Dim M As ObjektSpielMenü = Objektverwalter.Menü
                M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
            End If
        End If
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        'Wir haben noch eine Truppe gemacht
        Objektverwalter.Spielfeld.Aufzeichnung.DeployedUnits(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler - 1) += 1
        Objektverwalter.Spielfeld.Sichterstellen()
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
    End Sub
    Public Shared Sub EinheitBauenFlugzeugträger(ByVal Daten() As String, ByVal X As Integer, ByVal Y As Integer, Optional ByVal HatSichBewegt As Boolean = True, Optional ByVal KIBau As Boolean = False)
        If Objektverwalter.Spielfeld.AktuellerSpieler.VeränderteWerte.KeinBau = False Then
            Dim Einheitenname As String = Daten(0)
            If Daten.Length > 2 Then
                For I = 1 To Daten.Length - 2
                    If Not Daten(I) = "" Then
                        Einheitenname += " " + Daten(I)
                    End If
                Next
            End If
            Dim EinheitID As String = ObjektLadeklasse.GetIDFromName(Einheitenname)

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As KIPassivNetzwerk.Befehl
                Befehl.Befehl = ObjektKI.KIModiExtern.FlugzeugträgerBau
                Befehl.KooX = X
                Befehl.KooY = Y
                Dim ID As Integer = -1
                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                    If Objektverwalter.AlleEinheiten(I).EinheitenID = EinheitID Then
                        ID = I
                        Exit For
                    End If
                Next
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                    Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                Else
                    Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                    Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                End If
                Befehl.OpferX = Befehl.WegX(0)
                Befehl.OpferY = Befehl.WegY(0)
                Befehl.AngreiferSchaden = ID
                Befehl.Verteidigerschaden = HatSichBewegt
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenü.NetzBefehlSenden(Befehl)
            End If

            HatSichBewegt = True
            Dim E As ObjektEinheit
            E = ObjektLadeklasse.NewEinheit(EinheitID, Spielfeld.AktuellerSpieler.Spieler, X, Y, HatSichBewegt)
            E.SetKP(Objektverwalter.Spielfeld.AktuellerSpieler.VeränderteWerte.TPBauEinheiten)
            For I = 0 To Objektverwalter.Spielfeld.AktuelleEinheit.Ladung.Length - 1
                If Objektverwalter.Spielfeld.AktuelleEinheit.Ladung(I) Is Nothing Then
                    Objektverwalter.Spielfeld.AktuelleEinheit.Ladung(I) = E
                    Exit For
                End If
            Next
            If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
                Objektverwalter.Spielfeld.AktuelleEinheit.Munition -= 1
            End If
            Spielfeld.Regeln.SindBesiegbar()
            'Wir müssen die Einheit bezahlen
            Spielfeld.AktuellerSpieler.AddFonds(-Daten(Daten.Length - 1))
            If KIBau = False Then
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\OK.wav", False)
                Dim M As ObjektSpielMenü = Objektverwalter.Menü
                M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
            End If
            Warten()
        End If
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        'Wir haben noch eine Truppe gemacht
        Objektverwalter.Spielfeld.Aufzeichnung.DeployedUnits(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler - 1) += 1
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
    End Sub
    Public Shared Sub SiloZünden(ByVal X As Integer, ByVal Y As Integer)

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.SiloZünden
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        'Wir Feuern jetzt eine Rakete in das Zielgebiet Bumm
        Dim X1, Y1 As Integer
        If IsNothing(Spielfeld.Laufen) Then
            X1 = Spielfeld.AktuelleEinheitPosition.X : Y1 = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X1 = Spielfeld.Laufen.Position.X : Y1 = Spielfeld.Laufen.Position.Y
        End If
        If IsNothing(Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebäude) = False Then
            Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebäude = ObjektLadeklasse.NewGebäude(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebäude.WirdZu, Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebäude.Spieler, X1, Y1, Nothing)
        End If
        'die Rakete wird abgefeuert und eine Animation abgespielt.=)
        'Objektverwalter.NeuObjektAnimation(New Point(X, Y), "SILOEXPLOSION+KLEIN")
        Explosion(X, Y, 2, 3, "LAND", ObjektSpielfeld.Bodenschlacht)
        Warten()
    End Sub
    Public Shared Sub Reparieren(ByVal X As Integer, ByVal Y As Integer)

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Reparieren
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Heilen(Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht))
        Ration(X, Y, False, 2, Spielfeld.MomentaneSchlacht)
        MarkierteFelder.Clear()
        NeuObjektAnimation(X, Y, "Ration", "")
        Warten()
    End Sub
    Public Shared Sub ReparierenAnzeigen()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Reparieren
        Dim Feld As Point
        If IsNothing(Spielfeld.Laufen) Then
            Feld = New Point(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
        Else
            Feld = New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
        End If
        For I = 0 To 3
            Select Case I
                Case 0
                    Feld.Y -= 1
                Case 1
                    Feld.Y += 1
                    Feld.X += 1
                Case 2
                    Feld.Y += 1
                    Feld.X -= 1
                Case 3
                    Feld.Y -= 1
                    Feld.X -= 1
            End Select
            If Feld.X >= 0 And Feld.X < Spielfeld.Breite And Feld.Y >= 0 And Feld.Y < Spielfeld.Höhe Then
                If IsNothing(Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.MomentaneSchlacht)) = False Then
                    If Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.MomentaneSchlacht).Spieler = Spielfeld.AktuelleEinheit.Spieler Then
                        neuMarkiertesFeld(Feld.X, Feld.Y, Color.FromArgb(160, 255, 255, 255))
                    End If
                End If
            End If
        Next
        Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenü.Feldbreite)
    End Sub
    Public Shared Sub Explosion()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Explosion
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        If IsNothing(Spielfeld.Laufen) Then
            Explosion(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, 3, 5, "BOMBE", Spielfeld.AktuelleEinheit.GetMap)
        Else
            Explosion(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, 3, 5, "BOMBE", Spielfeld.AktuelleEinheit.GetMap)
        End If
        Spielfeld.LaufenLöschen = True
        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Explosion(ByVal X As Integer, ByVal Y As Integer, ByVal Reichweite As Integer, ByVal Schaden As Integer, ByVal ExplosionsArt As String, ByVal Schlacht As Integer)
        Dim Kreis(,) As Integer = {}
        Kreis = Kreisfunktion(Reichweite)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If X - Reichweite + X1 >= 0 And X - Reichweite + X1 < Spielfeld.Breite And Y - Reichweite + Y1 >= 0 And Y - Reichweite + Y1 < Spielfeld.Breite Then
                        DoDamage(X - Reichweite + X1, Y - Reichweite + Y1, Schaden, Schlacht)
                    End If
                End If
            Next
        Next
        ObjektLadeklasse.SiloExplosion(Reichweite, ExplosionsArt, X, Y, Schlacht)
    End Sub
    Public Shared Sub DoDamage(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Schlacht As Integer)
        If X >= 0 And Y >= 0 And X < Spielfeld.Breite And Y < Spielfeld.Höhe Then
            If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                Dim KP As Integer = Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
                If KP <= 0 Then
                    NeuObjektAnimation(X, Y)
                    Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
                Else
                    Spielfeld.Einheiten(X, Y, Schlacht).Leben = KP * 10
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' erstellt ein Menü in dem Preis und Gebäude aufgelistet sind, die gebaut werden können.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub GebäudeBauMenüerschaffen(ByVal X As Integer, ByVal Y As Integer)
        Dim Landschaft As String = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID
        Dim Namen As New Stack(Of String)
        Dim Symbole As New Stack(Of Texture)
        Dim Enabled As New Stack(Of Boolean)
        Dim SymbolMasken As New Stack(Of Texture)
        'Wenn man Material hat kann man bauen?
        If Spielfeld.AktuelleEinheit.HasMaterial Then
            If Spielfeld.AktuelleEinheit.Munition <= 0 Then
                Exit Sub
            End If
        End If
        Dim F As Bitmap = Hauptmenü.Farbtabelleerstellen(Objektverwalter.Spielfeld.AktuellerSpieler.Farbe)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht Then
            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Luftschlacht).getID = "LUFT" Then
                'Die Minigeschütz werden hinzugefügt.
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenüitem("Fliegendes Minigeschütz Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N+Maske.png")), SymbolMasken)
                Else
                    addMenüitem("Fliegendes Minigeschütz Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N+Maske.png")), SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenüitem("Fliegendes Minigeschütz Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O+Maske.png")), SymbolMasken)
                Else
                    addMenüitem("Fliegendes Minigeschütz Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O+Maske.png")), SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenüitem("Fliegendes Minigeschütz Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S+Maske.png")), SymbolMasken)
                Else
                    addMenüitem("Fliegendes Minigeschütz Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S+Maske.png")), SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenüitem("Fliegendes Minigeschütz West bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W+Maske.png")), SymbolMasken)
                Else
                    addMenüitem("Fliegendes Minigeschütz West bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDESMINIGESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W+Maske.png")), SymbolMasken)
                End If
                If KannGebäudeLuftplaziertwerden(X, Y, "FLIEGENDEFESTUNG") Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("FLIEGENDEFESTUNG")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("FLIEGENDEFESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                        addMenüitem("Fliegende Festung bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDEFESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                    Else
                        addMenüitem("Fliegende Festung bauen " + ObjektLadeklasse.GetGebäudeKosten("FLIEGENDEFESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                    End If
                End If
            End If
        End If
        'Mauern
        If KannBauen(X, Y, "MAUER") Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("MAUER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Mauer bauen " + ObjektLadeklasse.GetGebäudeKosten("MAUER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\MAUER.png")), Symbole, Namen, False, Enabled, , SymbolMasken)
            Else
                addMenüitem("Mauer bauen " + ObjektLadeklasse.GetGebäudeKosten("MAUER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\MAUER.png")), Symbole, Namen, True, Enabled, , SymbolMasken)
            End If
        End If
        'Brücken
        If KannBauen(X, Y, "BRÜCKE") Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("BRÜCKE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Brücke bauen " + ObjektLadeklasse.GetGebäudeKosten("BRÜCKE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\BauBrücke.png")), Symbole, Namen, False, Enabled)
            Else
                addMenüitem("Brücke bauen " + ObjektLadeklasse.GetGebäudeKosten("BRÜCKE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\BauBrücke.png")), Symbole, Namen, True, Enabled)
            End If
        End If
        If ISBauuntergrund(Landschaft) = True Then
            'Der Kristall wird hinzugefügt.
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("KRISTALL", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Kristall bauen " + ObjektLadeklasse.GetGebäudeKosten("KRISTALL", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Kristall.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Kristall+Maske.png")), SymbolMasken)
            Else
                addMenüitem("Kristall bauen " + ObjektLadeklasse.GetGebäudeKosten("KRISTALL", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Kristall.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Kristall+Maske.png")), SymbolMasken)
            End If
            'Die Minigeschütz werden hinzugefügt.
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Minigeschütz Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N+Maske.png")), SymbolMasken)
            Else
                addMenüitem("Minigeschütz Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+N+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Minigeschütz Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O+Maske.png")), SymbolMasken)
            Else
                addMenüitem("Minigeschütz Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+O+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Minigeschütz Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S+Maske.png")), SymbolMasken)
            Else
                addMenüitem("Minigeschütz Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+S+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Minigeschütz West bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W+Maske.png")), SymbolMasken)
            Else
                addMenüitem("Minigeschütz West bauen " + ObjektLadeklasse.GetGebäudeKosten("MINIGESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Minigeschütz+W+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("LASER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Laser bauen " + ObjektLadeklasse.GetGebäudeKosten("LASER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\laser.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\laser+maske.png")), SymbolMasken)
            Else
                addMenüitem("Laser bauen " + ObjektLadeklasse.GetGebäudeKosten("LASER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\laser.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\laser+maske.png")), SymbolMasken)
            End If
            'So jetzt kommen die nächst größeren Gebäude mit drei auf drei Feldern ausdehnung.
            If KannGebäudeplaziertwerden(X, Y, "SCHWARZE GESCHÜTZ+N") Then
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+S")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+S")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz West bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHWARZE GESCHÜTZ+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schwarze Geschütz West bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHWARZE GESCHÜTZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                'Jetzt die Schocklaser
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser Nord bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser Ost bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+S")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser Süd bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser West bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("SCHOCKLASER+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Schocklaser West bauen " + ObjektLadeklasse.GetGebäudeKosten("SCHOCKLASER+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("MONOLITH", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("MONOLITH")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Monolith bauen " + ObjektLadeklasse.GetGebäudeKosten("MONOLITH", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("MONOLITH")
                    Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                    addMenüitem("Monolith bauen " + ObjektLadeklasse.GetGebäudeKosten("MONOLITH", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If KannGebäudeplaziertwerden(X, Y, "OMEGARAKETE") Then
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("OMEGARAKETE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                        Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("OMEGARAKETE")
                        Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                        addMenüitem("Omega-Rakete bauen " + ObjektLadeklasse.GetGebäudeKosten("OMEGARAKETE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                    Else
                        Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("OMEGARAKETE")
                        Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                        addMenüitem("Omega-Rakete bauen " + ObjektLadeklasse.GetGebäudeKosten("OMEGARAKETE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                    End If
                End If
                If KannGebäudeplaziertwerden(X, Y, "FESTUNG") Then
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("FESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                        Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("FESTUNG")
                        Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                        addMenüitem("Festung bauen " + ObjektLadeklasse.GetGebäudeKosten("FESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                    Else
                        Dim I As Integer = Objektverwalter.GebäudeTextur.GetGebäudeID("FESTUNG")
                        Dim Symbol As Texture = Objektverwalter.AlleGebäude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebäude(I).SymbolTexturMaske
                        addMenüitem("Festung bauen " + ObjektLadeklasse.GetGebäudeKosten("FESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                    End If
                End If
            End If
        ElseIf Landschaft = "RAKETENSILO" Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebäudeKosten("SILO", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenüitem("Rakete bauen " + ObjektLadeklasse.GetGebäudeKosten("SILO", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Raketebauen.png"), Symbole, Namen, False, Enabled)
            Else
                addMenüitem("Rakete bauen " + ObjektLadeklasse.GetGebäudeKosten("SILO", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Raketebauen.png"), Symbole, Namen, True, Enabled)
            End If
        End If
        If Namen.Count > 0 Then
            EinheitenMenü = New ObjektEinheitenmenü(Namen.ToArray, Symbole.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenü.Feldbreite, X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, False, Enabled.ToArray, False, True, ObjektEinheitenmenü.Modi.Gebäudebauen, SymbolMasken.ToArray)
        End If
    End Sub
    ''' <summary>
    ''' Überprüft ob wir eine Mauer oder Brücke bauen können
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function KannBauen(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String) As Boolean
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        Dim P As New Point(X, Y)
        Dim Untergund As String() = {}
        Select Case ID
            Case "BRÜCKE"
                Untergund = New String() {"FLUSS", "SEE"}
            Case "MAUER"
                Untergund = New String() {"EBENE", "EBENE+SCHROTT", "STRAßE", "SCHNEE", "SCHNEE+SCHROTT", "WÜSTE", "WÜSTE+SCHROTT", "PFAD", "STRAßENFROST"}
        End Select
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                If Untergund.Contains(Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).getID) Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function
    Private Shared Function KannGebäudeplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String) As Boolean
        Dim G As ObjektGebäude = ObjektLadeklasse.NewGebäude(ID)
        For X2 = 0 To G.Verweisgebäude.GetLength(0) - 1
            If X + G.Verweisgebäude(X2, 0) >= 0 And Y + G.Verweisgebäude(X2, 1) >= 0 And X + G.Verweisgebäude(X2, 0) < Objektverwalter.Spielfeld.Breite And Y + G.Verweisgebäude(X2, 1) < Objektverwalter.Spielfeld.Höhe Then
                If ISBauuntergrund(Objektverwalter.Spielfeld.Landschaften(X + G.Verweisgebäude(X2, 0), Y + G.Verweisgebäude(X2, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).getID) = False Then
                    Return False
                ElseIf Not Objektverwalter.Spielfeld.Einheiten(X + G.Verweisgebäude(X2, 0), Y + G.Verweisgebäude(X2, 1), Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                    Return False
                End If
            Else
                Return False
            End If
        Next
        Return True
    End Function
    Private Shared Function KannGebäudeLuftplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String) As Boolean
        Dim G As ObjektGebäude = ObjektLadeklasse.NewGebäude(ID)
        For X2 = 0 To G.Verweisgebäude.GetLength(0) - 1
            If X + G.Verweisgebäude(X2, 0) >= 0 And Y + G.Verweisgebäude(X2, 1) >= 0 And X + G.Verweisgebäude(X2, 0) < Objektverwalter.Spielfeld.Breite And Y + G.Verweisgebäude(X2, 1) < Objektverwalter.Spielfeld.Höhe Then
                If Objektverwalter.Spielfeld.Landschaften(X + G.Verweisgebäude(X2, 0), Y + G.Verweisgebäude(X2, 1), ObjektSpielfeld.Luftschlacht).getID <> "LUFT" Then
                    Return False
                ElseIf Not Objektverwalter.Spielfeld.Einheiten(X + G.Verweisgebäude(X2, 0), Y + G.Verweisgebäude(X2, 1), ObjektSpielfeld.Luftschlacht) Is Nothing Then
                    Return False
                End If
            Else
                Return False
            End If
        Next
        Return True
    End Function
    ''' <summary>
    ''' Gibt zurück ob der Untergrund Ebene Schnee oder Wüste ist auf dem Gebäude erstellt werden können.
    ''' </summary>
    ''' <param name="Landschaft"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function ISBauuntergrund(ByVal Landschaft As String) As Boolean
        If Landschaft = "EBENE" Or Landschaft = "WÜSTE" Or Landschaft = "SCHNEE" Or Landschaft = "EBENE+SCHROTT" Or Landschaft = "WÜSTE+SCHROTT" Or Landschaft = "SCHNEE+SCHROTT" Then
            Return True
        Else
            Return False
        End If
    End Function
    Public Shared Sub GebäudeBauen(ByVal X As Integer, ByVal Y As Integer, ByVal GebäudeID As String)
        Dim M As ObjektSpielMenü = Objektverwalter.Menü


        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            'Dieser Befehl wird später verschickt
            If Not GebäudeID = "MAUER" Then
                If Not GebäudeID = "BRÜCKE" Then

                    Dim Befehl As KIPassivNetzwerk.Befehl
                    Befehl.Befehl = ObjektKI.KIModiExtern.GebäudeBauen
                    Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                    Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                    If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                        Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                        Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                    Else
                        Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                        Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                    End If
                    Befehl.OpferX = Befehl.WegX(0)
                    Befehl.OpferY = Befehl.WegY(0)
                    Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebäudeZahlID(GebäudeID)
                    Befehl.Verteidigerschaden = -1
                    Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                    Hauptmenü.NetzBefehlSenden(Befehl)
                End If
            End If

        End If

        'Der Spieler verliert sein Geld
        If GebäudeID <> "BRÜCKE" Then
            If GebäudeID <> "MAUER" Then
                Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(-ObjektLadeklasse.GetGebäudeKosten(GebäudeID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler))
            End If
        End If
        If GebäudeID = "SILO" Then
            Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = ObjektLadeklasse.NewGebäude("RAKETENSILO+RAKETE", 0, X, Y)
            Warten()
        ElseIf GebäudeID = "MAUER" Then
            M.Spielmodus = ObjektSpielMenü.Spielmodi.MauerBauen
            BauFelderMarkieren(X, Y)
        ElseIf GebäudeID = "BRÜCKE" Then
            M.Spielmodus = ObjektSpielMenü.Spielmodi.BrückeBauen
            BauFelderMarkieren(X, Y)
        ElseIf GebäudeID = "FLIEGENDESMINIGESCHÜTZ+N" Or GebäudeID = "FLIEGENDESMINIGESCHÜTZ+S" Or GebäudeID = "FLIEGENDESMINIGESCHÜTZ+W" Or GebäudeID = "FLIEGENDESMINIGESCHÜTZ+O" _
        Or GebäudeID = "FLIEGENDEFESTUNG" Then
            SpezialGebäudeBauen(X, Y, GebäudeID, ObjektSpielfeld.Luftschlacht)
            Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
            Spielfeld.LaufenLöschen = True
            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
            Spielfeld.Sichterstellen()
            Spielfeld.Regeln.CheckSieg()

            M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        Else
            'wir bauen das Spezialgebäude und entfernen die Einheit.
            SpezialGebäudeBauen(X, Y, GebäudeID, ObjektSpielfeld.Bodenschlacht)
            Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
            Spielfeld.LaufenLöschen = True
            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
            Spielfeld.Sichterstellen()
            Spielfeld.Regeln.CheckSieg()
            M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        End If
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub SpezialGebäudeBauen(ByVal X As Integer, ByVal Y As Integer, ByVal GebäudeID As String, ByVal Schlacht As Integer)
        Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude = ObjektLadeklasse.NewGebäude(GebäudeID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, X, Y, Nothing)
    End Sub
    ''' <summary>
    ''' Wenn True dann kann die Einheit besetzen.
    ''' </summary>
    ''' <param name="EinheitenID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KannEinheitBesetzen(ByVal EinheitenID As String) As Boolean
        For Each Einheit In AlleEinheiten
            If Einheit.EinheitenID = EinheitenID Then
                If Einheit.Einheit.KannBesetzen = True Then
                    Return True
                Else
                    Return False
                End If
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' Gibt zurück ob die Einheit Waffen hat mit denen sie angreifen kann.
    ''' </summary>
    ''' <param name="EinheitenID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function HatEinheitWaffen(ByVal EinheitenID As String) As Boolean
        For Each Einheit In AlleEinheiten
            If Einheit.EinheitenID = EinheitenID Then
                If Not Einheit.Einheit.Waffe1 = "Keine" Or Not Einheit.Einheit.Waffe2 = "Keine" Then
                    Return True
                Else
                    Return False
                End If
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' Überprüft nur die Sende Map nicht ob das Feld frei ist.
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KannSchicken(ByVal Einheit As ObjektEinheit) As Boolean
        If Einheit.GetSendeMap >= 0 Then
            Return True
        Else
            Return False
        End If
    End Function
    Public Shared Function KannSchicken() As Boolean
        Dim SendeMap As Integer = Objektverwalter.Spielfeld.AktuelleEinheit.GetSendeMap
        If SendeMap >= 0 Then
            If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                If Objektverwalter.Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, SendeMap) Is Nothing Then
                    Return True
                Else
                    Return False
                End If
            Else
                If Objektverwalter.Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, SendeMap) Is Nothing Then
                    Return True
                Else
                    Return False
                End If
            End If
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Baut eine temporäre Basis, diese können Versorgen und Reparieren, aber nicht bauen!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub BuildTempBase()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Warten
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        If Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX.Length - 1 <= Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite >= 0 Then
                Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(True)
            Else
                Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
            End If
        Else
            Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
        End If
        If IsNothing(Spielfeld.Laufen) Then
            MarkierteFelder.Clear()
            Spielfeld.AktuelleEinheit.HatsichBewegt = True
            Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenü.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenü.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenü.Feldbreite)
            'Bauen
            If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                TTP.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitBaupanzer Then
                Dim BauPanzer As EinheitBaupanzer = Spielfeld.AktuelleEinheit
                BauPanzer.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitCustom Then
                Dim BauPanzer As EinheitCustom = Spielfeld.AktuelleEinheit
                BauPanzer.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            End If
        Else
            If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                Else
                    Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                End If
            End If
            If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Höllium.tostring Then
                If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                    NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                End If
            End If
            'Bauen
            If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                TTP.StopBuildTempBase()
                TTP.BuildTempBase(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitBaupanzer Then
                Dim BauPanzer As EinheitBaupanzer = Spielfeld.AktuelleEinheit
                BauPanzer.StopBuildTempBase()
                BauPanzer.BuildTempBase(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitCustom Then
                Dim BauPanzer As EinheitCustom = Spielfeld.AktuelleEinheit
                BauPanzer.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            End If


            Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
            Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
            Spielfeld.AktuelleEinheit.HatsichBewegt = True
            Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenü.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenü.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenü.Feldbreite)
            Spielfeld.LaufenLöschen = True
        End If



        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        Spielfeld.AktuelleEinheitHatGefeuert = False
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Macht die aktuelle Einheit zur KO Einheit
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub CreateKOEinheit()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.CreateKOEinheit
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.AktuellerSpieler.AddFonds(-Spielfeld.AktuelleEinheit.Kosten / 2)
        If Objektverwalter.Spielfeld.Laufen Is Nothing Then
            Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).KOS(0).SetKOEinheit(Spielfeld.AktuelleEinheit)
            Einheitabwählen()
        Else
            Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).KOS(0).SetKOEinheit(Spielfeld.AktuelleEinheit)
            Warten()
        End If
    End Sub
    Public Shared Sub MauerBrückeBauen(ByVal X As Integer, ByVal Y As Integer)
        Dim M As ObjektSpielMenü = Menü

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.GebäudeBauen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Select Case M.Spielmodus
                Case ObjektSpielMenü.Spielmodi.MauerBauen
                    Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebäudeZahlID("MAUER")
                Case ObjektSpielMenü.Spielmodi.BrückeBauen
                    Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebäudeZahlID("BRÜCKE")
            End Select

            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        'So jetzt müssen wir es noch tun
        Select Case M.Spielmodus
            Case ObjektSpielMenü.Spielmodi.MauerBauen
                Spielfeld.AktuellerSpieler.AddFonds(-ObjektLadeklasse.GetGebäudeKosten("MAUER", Spielfeld.AktuellerSpieler.Spieler))
                Dim ID As String = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft("MAUER", X, Y, Spielfeld)
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).WirdZu = ID
                AngrenzendeÜbergängeAktualisieren(X, Y, New String() {"MAUER"})
            Case ObjektSpielMenü.Spielmodi.BrückeBauen
                Spielfeld.AktuellerSpieler.AddFonds(-ObjektLadeklasse.GetGebäudeKosten("BRÜCKE", Spielfeld.AktuellerSpieler.Spieler))
                Dim ID As String = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft("BAUBRÜCKE", X, Y, Spielfeld)
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).WirdZu = ID
                AngrenzendeÜbergängeAktualisieren(X, Y, New String() {"BAUBRÜCKE", "SEE", "STRAND", "FLUSS"})
        End Select
        Warten()
    End Sub
    Public Shared Sub BauFelderMarkieren(ByVal X As Integer, ByVal Y As Integer)
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        Dim P As New Point(X, Y)
        Dim Untergund As String() = {}
        Dim M As ObjektSpielMenü = Menü
        Select Case M.Spielmodus
            Case ObjektSpielMenü.Spielmodi.BrückeBauen
                Untergund = New String() {"FLUSS", "SEE"}
            Case ObjektSpielMenü.Spielmodi.MauerBauen
                Untergund = New String() {"EBENE", "EBENE+SCHROTT", "STRAßE", "SCHNEE", "SCHNEE+SCHROTT", "WÜSTE", "WÜSTE+SCHROTT", "PFAD", "STRAßENFROST"}
        End Select
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                If Untergund.Contains(Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).getID) Then
                    neuMarkiertesFeld(X2, Y2, Color.FromArgb(160, 255, 255, 255), "Blau")
                End If
            End If
        Next
        Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenü.Feldbreite)
    End Sub
    Public Shared Sub AngrenzendeÜbergängeAktualisieren(ByVal X As Integer, ByVal Y As Integer, ByVal Untergund() As String)
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        Dim P As New Point(X, Y)

        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                If Untergund.Contains(Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).getID) Then
                    Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).ÜbergängeAktualisieren(X2, Y2, Spielfeld)
                End If
            End If
        Next
    End Sub
    ''' <summary>
    ''' Zeigt die Rang Zone der Einheit an!
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Function ShowRangZone(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)
        If E IsNot Nothing Then
            Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, 0)
            Dim Zone As Integer = E.GetUpgradeZone
            If Zone >= 0 Then
                Do Until L Is Nothing
                    neuMarkiertesFeld(L.KooX, L.KooY, Color.FromArgb(160, 255, 255, 255), "Gelb")
                    L = Wegsuchsystem.getFeldRundrum(X, Y, 0, 0, Zone, L, Spielfeld)
                Loop
            End If
            If MarkierteFelder.Count > 0 Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
#End Region
#Region "Gebäude Befehle"
    Public Shared Sub Gebäudeauswählen(ByVal X As Integer, ByVal Y As Integer)
        If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GebäudeID = "Verweis" Then
            X = Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.X
            Y = Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.Y
        End If
        Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
        If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = Spielfeld.AktuellerSpieler.Spieler Then
            If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetBaulisteThisPlayer.Length > 0 Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.Keiner Then
                    CreateBauMenü(X, Y)
                End If
            ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.FabrikBauen Then
                Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuer(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y)
            ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.Rakete Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuerbereit = 0 Then
                    Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuer(X, Y)
                End If
            ElseIf Not Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Schaden = 0 Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.Strahl Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Feuer.png")}
                        Dim Namen() As String = {"Laser"}
                        EinheitenMenü = New ObjektEinheitenmenü(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.Kreis Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Heilen.png")}
                        Dim Namen() As String = {"Heilen"}
                        EinheitenMenü = New ObjektEinheitenmenü(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.SchussN Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.SchussO Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.SchussS Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.SchussW Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Feuer.png")}
                        Dim Namen() As String = {"Schuss"}
                        EinheitenMenü = New ObjektEinheitenmenü(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.KugelKreis Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Feuer.png")}
                        Dim Namen() As String = {"Kugel Feuern"}
                        EinheitenMenü = New ObjektEinheitenmenü(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.DreiStrahlN Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.DreiStrahlO Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.DreiStrahlS Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Angriff = ObjektGebäude.Angriffe.DreiStrahlW Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "MenüIcons\Feuer.png")}
                        Dim Namen() As String = {"Schocklaser"}
                        EinheitenMenü = New ObjektEinheitenmenü(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler, Hauptmenü.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenü.Modi.Anderes)
                    End If
                Else

                End If
            Else
                AuswahlMenüerschaffen()
            End If
        ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetBaulisteThisPlayer.Length > 0 Then
            'Mal sehen
            Select Case Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Baugebäude
                Case ObjektKO.ReperaturGebäude.OwnAndEnemyAndNeutral
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetSpieler.Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.OwnAndEnemy
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetSpieler.Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team And Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler > 0 Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.OwnAndNeutral
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = 0 Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.Own
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.Allied
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.AlliedAndEnemy
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler > 0 And Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetSpieler.Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.AlliedAndNeutral
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.Spieler = 0 Then
                        CreateBauMenü(X, Y)
                    Else
                        AuswahlMenüerschaffen()
                    End If
                Case ObjektKO.ReperaturGebäude.AlliedAndEnemyAndNeutral
                    CreateBauMenü(X, Y)
            End Select
        Else
            AuswahlMenüerschaffen()
        End If
    End Sub
    Public Shared Sub CreateBauMenü(ByVal X As Integer, ByVal Y As Integer)
        If Objektverwalter.Spielfeld.AktuellerSpieler.VeränderteWerte.KeinBau = False Then

            Dim Symbolen As New Stack(Of Texture)
            Dim SymbolMasken As New Stack(Of Texture)

            Dim Namen As New Stack(Of String)
            Dim Enabled As New Stack(Of Boolean)
            If Spielfeld.AktuelleEinheit Is Nothing Then
                Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                Dim B() As String = Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebäude.GetBauliste(Spielfeld.AktuellerSpieler.Spieler)
                For I = 0 To B.Length - 1
                    Dim Name As String = ""
                    Name = ObjektLadeklasse.GetNamefromID(B(I)) + " "
                    Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(B(I)) * Spielfeld.AktuellerSpieler.Teurungsrate(B(I), X, Y)
                    If IsNothing(Spielfeld.AktuellerSpieler.Bauliste) Then
                        Name += Kosten.ToString
                        If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                            Enabled.Push(True)
                        Else
                            Enabled.Push(False)
                        End If
                        Dim ID As Integer = 0
                        For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                            If Objektverwalter.AlleEinheiten(I2).EinheitenID = B(I).ToUpper Then
                                ID = I2
                                Exit For
                            End If
                        Next
                        Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                        Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                        addMenüitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                    Else
                        If Spielfeld.AktuellerSpieler.Bauliste.GetWert(B(I)) > 0 Then
                            'Es ist erlaubt diese Einheit zu bauen
                            Name += Kosten.ToString
                            If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                                Enabled.Push(True)
                            Else
                                Enabled.Push(False)
                            End If
                            Dim ID As Integer = 0
                            For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If Objektverwalter.AlleEinheiten(I2).EinheitenID = B(I).ToUpper Then
                                    ID = I2
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                            addMenüitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                        End If
                    End If
                Next
                If Namen.Count > 0 Then
                    EinheitenMenü = New ObjektEinheitenmenü(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenü.Feldbreite, X * Hauptmenü.Feldbreite + Spielfeld.BildschirmKooX, Y * Hauptmenü.Feldbreite + Spielfeld.BildschirmKooY, True, Enabled.ToArray, False, False, ObjektEinheitenmenü.Modi.Einheitbauen, SymbolMasken.ToArray)
                Else

                End If
            Else
                Dim Bauliste As String() = ObjektLadeklasse.GetBauliste("FLUGZEUGTRÄGER")
                For I = 0 To Bauliste.Length - 1
                    Dim Name As String = ""
                    Name = ObjektLadeklasse.GetNamefromID(Bauliste(I)) + " "
                    Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(Bauliste(I)) * Spielfeld.AktuellerSpieler.Teurungsrate(Bauliste(I), X, Y)
                    If IsNothing(Spielfeld.AktuellerSpieler.Bauliste) Then
                        Name += Kosten.ToString
                        If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                            Enabled.Push(True)
                        Else
                            Enabled.Push(False)
                        End If
                        Dim ID As Integer = 0
                        For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                            If Objektverwalter.AlleEinheiten(I2).EinheitenID = Bauliste(I).ToUpper Then
                                ID = I2
                                Exit For
                            End If
                        Next
                        Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                        Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                        addMenüitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                    Else
                        If Spielfeld.AktuellerSpieler.Bauliste.GetWert(Bauliste(I)) > 0 Then
                            'Es ist erlaubt diese Einheit zu bauen
                            Name += Kosten.ToString
                            If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                                Enabled.Push(True)
                            Else
                                Enabled.Push(False)
                            End If
                            Dim ID As Integer = 0
                            For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If Objektverwalter.AlleEinheiten(I2).EinheitenID = Bauliste(I).ToUpper Then
                                    ID = I2
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                            addMenüitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                        End If
                    End If
                Next
                If Namen.Count > 0 Then
                    EinheitenMenü = New ObjektEinheitenmenü(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenü.Feldbreite, X * Hauptmenü.Feldbreite + Spielfeld.BildschirmKooX, Y * Hauptmenü.Feldbreite + Spielfeld.BildschirmKooY, True, Enabled.ToArray, False, False, ObjektEinheitenmenü.Modi.Einheitbauen, SymbolMasken.ToArray)
                Else

                End If
            End If
        End If
    End Sub
#End Region
#Region "Plazieren und Löschen von Dingen im Editor"
    ''' <summary>
    ''' Generiert die Übergänge aller Landschaften neu
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub ÜbergängeAktualiesieren()
        Dim ÜbergängenochmalAktualiesieren As Boolean = False
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).BildIDFest Then
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).BildID = Objektverwalter.LandschaftenBilder(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).ID).BildID(X, Y, Objektverwalter.Spielfeld)
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).BildID < 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft("EBENE", X, Y, Objektverwalter.Spielfeld)
                        ÜbergängenochmalAktualiesieren = True
                    Else
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).ÜbergangsIDS = Objektverwalter.LandschaftenBilder(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).ID).ÜbergangsID(X, Y, Objektverwalter.Spielfeld)
                    End If
                End If
            Next
        Next
        If ÜbergängenochmalAktualiesieren = True Then
            ÜbergängeAktualiesieren()
        End If
    End Sub
    Public Shared Function KannEinheitplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal EinheitenID As String, ByVal Wetter As ObjektSpielfeld.Wetterarten) As Boolean
        Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
        If M.Karteneditor.AktuelleEinheit = -1 Then Return False
        If Objektverwalter.Bewegungskosten(Objektverwalter.AlleEinheiten(M.Karteneditor.AktuelleEinheit).Einheit.Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, ObjektSpielfeld.Wetterarten.Sonne) > 0 Then
            Return True
        End If
        Return False
    End Function
    Public Shared Function KannLandschaftplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As Integer) As Boolean
        If Objektverwalter.LandschaftenBilder(ID).BildID(X, Y, Objektverwalter.Spielfeld) >= 0 Then
            Return True
        End If
        Return False
    End Function
    Public Shared Sub Einheitplazieren()
        Dim Kreis(,) As Integer = {}
        Dim Radius As Integer = 0
        Dim Karteneditor As ObjektKarteneditormenü = Objektverwalter.Menü
        Select Case Karteneditor.Karteneditor.Plaziergröße
            Case ObjektKarteneditor.PlazierGrößen.Klein
                Einheitplazieren(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y)
            Case ObjektKarteneditor.PlazierGrößen.Mittel
                Kreis = Kreisfunktion(1)
                Radius = 1
            Case ObjektKarteneditor.PlazierGrößen.Groß
                Kreis = Kreisfunktion(2)
                Radius = 2
            Case ObjektKarteneditor.PlazierGrößen.Füllen
                Einheitplazieren(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y)
        End Select
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Einheitplazieren(Hauptmenü.SpielfeldPunkt.X - Radius + X, Hauptmenü.SpielfeldPunkt.Y - Radius + Y)
                End If
            Next
        Next
    End Sub
    Public Shared Sub Landschaftplazieren()
        Dim Kreis(,) As Integer = {}
        Dim Radius As Integer = 0
        Dim Karteneditor As ObjektKarteneditormenü = Objektverwalter.Menü
        Select Case Karteneditor.Karteneditor.Plaziergröße
            Case ObjektKarteneditor.PlazierGrößen.Klein
                Landschaftplazieren(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y, True)
            Case ObjektKarteneditor.PlazierGrößen.Mittel
                Kreis = Kreisfunktion(1)
                Radius = 1
            Case ObjektKarteneditor.PlazierGrößen.Groß
                Kreis = Kreisfunktion(2)
                Radius = 2
            Case ObjektKarteneditor.PlazierGrößen.Füllen
                If Hauptmenü.SpielfeldPunkt.X >= 0 And Hauptmenü.SpielfeldPunkt.Y >= 0 And Hauptmenü.SpielfeldPunkt.Y < Objektverwalter.Spielfeld.Höhe And Hauptmenü.SpielfeldPunkt.X < Objektverwalter.Spielfeld.Breite Then
                    Dim LS As New Landschaftssuchsystem(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.Landschaften(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                        For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            If LS.GetDauer(X, Y) >= 0 Then
                                Landschaftplazieren(X, Y, False)
                            End If
                        Next
                    Next
                End If
        End Select
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Landschaftplazieren(Hauptmenü.SpielfeldPunkt.X - Radius + X, Hauptmenü.SpielfeldPunkt.Y - Radius + Y, False)
                End If
            Next
        Next
        If Karteneditor.Karteneditor.Plaziergröße > ObjektKarteneditor.PlazierGrößen.Klein Then
            ÜbergängeAktualiesieren()
        End If
    End Sub
    Public Shared Sub Gebäudeplazieren()
        Dim Kreis(,) As Integer = {}
        Dim Radius As Integer = 0
        Dim Karteneditor As ObjektKarteneditormenü = Objektverwalter.Menü
        Dim Gebäudeinstanz As ObjektGebäude = ObjektLadeklasse.NewGebäude(AlleGebäude(Karteneditor.Karteneditor.AktuelleGebäude).GebäudeID, Karteneditor.Karteneditor.MomenentanerSpieler, -10, -10, Nothing)
        Select Case Karteneditor.Karteneditor.Plaziergröße
            Case ObjektKarteneditor.PlazierGrößen.Klein
                Gebäudeplazieren(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y, Gebäudeinstanz)
            Case ObjektKarteneditor.PlazierGrößen.Mittel
                Kreis = Kreisfunktion(1)
                Radius = 1
            Case ObjektKarteneditor.PlazierGrößen.Groß
                Kreis = Kreisfunktion(2)
                Radius = 2
            Case ObjektKarteneditor.PlazierGrößen.Füllen
                If Objektverwalter.Spielfeld.OnMap(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y) Then
                    Dim LS As New Landschaftssuchsystem(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.Landschaften(Hauptmenü.SpielfeldPunkt.X, Hauptmenü.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                        For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            If LS.GetDauer(X, Y) >= 0 Then
                                Gebäudeplazieren(X, Y, Gebäudeinstanz)
                            End If
                        Next
                    Next
                End If
        End Select
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Gebäudeplazieren(Hauptmenü.SpielfeldPunkt.X - Radius + X, Hauptmenü.SpielfeldPunkt.Y - Radius + Y, Gebäudeinstanz)
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' Plaziert die ausgewählte Einheit
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Einheitplazieren(ByVal X As Integer, ByVal Y As Integer)
        Dim Karteneditor As ObjektKarteneditormenü = Objektverwalter.Menü
        If Not ObjektMaus.Zustand = ObjektMaus.Zustände.NichtPlazierbar Then
            If Not Karteneditor.Karteneditor.MomenentanerSpieler = 0 Then
                If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
                    If KannEinheitplaziertwerden(X, Y, Objektverwalter.AlleEinheiten(Karteneditor.Karteneditor.AktuelleEinheit).EinheitenID, ObjektSpielfeld.Wetterarten.Sonne) Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = ObjektLadeklasse.NewEinheit(Objektverwalter.AlleEinheiten(Karteneditor.Karteneditor.AktuelleEinheit).EinheitenID, Karteneditor.Karteneditor.MomenentanerSpieler, X, Y, False)
                        'Custom Einheiten müssen speziell geladen werden.
                        If TypeOf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is EinheitCustom Then
                            Dim C As EinheitCustom = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                            C.Datenladen(Karteneditor.Karteneditor.AktuelleEinheit)
                        End If
                    End If
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Plaziert die ausgewählte Landschaft
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Landschaftplazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Übergängeaktualisieren As Boolean)
        Dim Karteneditor As ObjektKarteneditormenü = Objektverwalter.Menü
        If Not ObjektMaus.Zustand = ObjektMaus.Zustände.NichtPlazierbar Then
            If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
                If KannLandschaftplaziertwerden(X, Y, Karteneditor.Karteneditor.AktuelleLandschaft) = True Then
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude) = False Then
                        GebäudeLöschen(X, Y)
                    End If
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(Objektverwalter.LandschaftenBilder(Karteneditor.Karteneditor.AktuelleLandschaft).ID, X, Y, Objektverwalter.Spielfeld)
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).ÜbergangsIDS = Objektverwalter.LandschaftenBilder(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).ID).ÜbergangsID(X, Y, Objektverwalter.Spielfeld)
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                        If KannEinheitplaziertwerden(X, Y, Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).EinheitenID, ObjektSpielfeld.Wetterarten.Sonne) = False Then
                            Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                        End If
                    End If
                End If
            End If
        End If
        If Übergängeaktualisieren Then
            ÜbergängeAktualiesieren()
        End If
    End Sub
    ''' <summary>
    ''' Plaziert ein Gebäude
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Gebäudeplazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Gebäudeinstanz As ObjektGebäude)
        Dim Karteneditor As ObjektKarteneditormenü = Objektverwalter.Menü
        If Not ObjektMaus.Zustand = ObjektMaus.Zustände.NichtPlazierbar Then
            If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
                If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude) = False Then
                    GebäudeLöschen(X, Y)
                End If
                If FindElement(Gebäudeinstanz.GetLandschaftsuntergrund, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).LandschaftsID, True) < 0 Then
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(Gebäudeinstanz.GetLandschaftsuntergrund(0), X, Y, Objektverwalter.Spielfeld)
                End If
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = ObjektLadeklasse.NewGebäude(Gebäudeinstanz.GebäudeID, Karteneditor.Karteneditor.MomenentanerSpieler, X, Y, Nothing)
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                    If Not Objektverwalter.Bewegungskosten(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, ObjektSpielfeld.Wetterarten.Sonne) > 0 Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                    End If
                End If
            End If
        End If
    End Sub
    Public Shared Sub SpezialGebäudePlazieren(ByVal X As Integer, ByVal Y As Integer)
        Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
        If Not ObjektMaus.Zustand = ObjektMaus.Zustände.NichtPlazierbar Then
            If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
                Dim Gebäudeinstanz As ObjektGebäude = ObjektLadeklasse.NewGebäude(Objektverwalter.AlleGebäude(M.Karteneditor.AktuellesSpezialGebäude).GebäudeID)
                Dim X1() As Integer = {X}
                Dim Y1() As Integer = {Y}
                Dim D(,) As Integer = New Integer(,) {}
                If IsNothing(Gebäudeinstanz) = False Then
                    D = Gebäudeinstanz.Verweisgebäude
                End If
                For I = 0 To D.GetLength(0) - 1
                    Dim X2 As Integer = D(I, 0) + X
                    Dim Y2 As Integer = D(I, 1) + Y
                    If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                        Array.Resize(X1, X1.Length + 1)
                        Array.Resize(Y1, Y1.Length + 1)
                        X1(X1.Length - 1) = X2
                        Y1(Y1.Length - 1) = Y2
                    Else
                        Exit Sub
                    End If
                Next
                For I = 0 To X1.Length - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude) = False Then
                        GebäudeLöschen(X1(I), Y1(I))
                    End If
                Next
                For I = 0 To X1.Length - 1
                    If FindElement(Gebäudeinstanz.GetLandschaftsuntergrund, Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).LandschaftsID, True) < 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(Gebäudeinstanz.GetLandschaftsuntergrund(0), X1(I), Y1(I), Objektverwalter.Spielfeld)
                    End If
                    If I = 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = ObjektLadeklasse.NewGebäude(Objektverwalter.GebäudeTextur.GetSpezialGebäude(M.Karteneditor.AktuellesSpezialGebäude, M.Karteneditor.MomenentanerSpieler).GebäudeID, M.Karteneditor.MomenentanerSpieler, X, Y)
                    End If
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                        If Not Objektverwalter.Bewegungskosten(Objektverwalter.Spielfeld.Einheiten(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).getID, ObjektSpielfeld.Wetterarten.Sonne) > 0 Then
                            Objektverwalter.Spielfeld.Einheiten(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                        End If
                    End If
                Next
                ÜbergängeAktualiesieren()
            End If
        End If
    End Sub
    Public Shared Sub GebäudeLöschen(ByVal X As Integer, ByVal Y As Integer)
        X = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.X
        Y = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.Y
        Dim D(,) As Integer = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Verweisgebäude
        For I = 0 To D.GetLength(0) - 1
            Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = Nothing
        Next
        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = Nothing
    End Sub
    Public Shared Function KannSpezialGebäudeplaziertwerden(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
        Dim Gebäudeinstanz As ObjektGebäude = ObjektLadeklasse.NewGebäude(Objektverwalter.AlleGebäude(M.Karteneditor.AktuellesSpezialGebäude).GebäudeID)
        Dim D(,) As Integer = Gebäudeinstanz.Verweisgebäude
        For I = 0 To D.GetLength(0) - 1
            Dim X2 As Integer = D(I, 0) + X
            Dim Y2 As Integer = D(I, 1) + Y
            If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then

            Else
                Return False
            End If
        Next
        Return True
    End Function
    Public Shared Sub EinheitAbziehen(ByVal X As Integer, ByVal Y As Integer, Optional ByVal GleicherSpieler As Boolean = False)
        If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                If GleicherSpieler = False Then
                    Objektverwalter.NeuObjektAnimation(X, Y)
                    '  Objektverwalter.Spielfeld.Einheiten(SpielfeldPunkt.X, SpielfeldPunkt.Y) = Nothing
                ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                    Objektverwalter.NeuObjektAnimation(X, Y)
                End If
            End If
        End If
    End Sub

#End Region
#Region "Zufallskarte"
    ''' <summary>
    ''' Erstellt eine Zufallskarte
    ''' </summary>
    ''' <param name="Breite"></param>
    ''' <param name="Höhe"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="Regeln"></param>
    ''' <remarks></remarks>
    Public Shared Function ZufallskarteSee(ByVal Breite As Integer, ByVal Höhe As Integer, ByVal Spieler() As ObjektSpieler, ByVal Regeln As ObjektRegeln, Optional ByVal Straßenkreis As Boolean = True, Optional ByVal StartVektor As Integer = -1) As Integer
        Objektverwalter.Spielfeld = New ObjektSpielfeld(Breite, Höhe, Spieler, Regeln)
        Dim R As Random
        If StartVektor < 0 Then
            StartVektor = Zufallszahl(0, Integer.MaxValue - 1)
            R = New Random(StartVektor)
        Else
            R = New Random(StartVektor)
        End If
        'wir erschaffen Areas von Landschaften
        Dim Max As Integer = Breite * Höhe * 2.5#
        For I = 0 To Max
            '0=Ebene 1=Wald 2=Berg 6=See  
            Dim Zahl As Integer = R.Next(100)
            If Zahl < 30 Then
                Zahl = 0
            ElseIf Zahl < 60 Then
                Zahl = 1
            ElseIf Zahl < 80 Then
                Zahl = 2
            ElseIf Zahl < 100 Then
                Zahl = 6
            Else
                Zahl = R.Next(2)
            End If
            Dim lim As Integer = 100
            If Zahl = 10 Then
                'Stadt
                'lim = r.nextInt(2)+1;
                lim = 1
            ElseIf Zahl = 0 Then
                'Ebene
                lim = R.Next(40) + 1
            ElseIf Zahl = 1 Then
                'Wald
                lim = R.Next(3) + 1
            ElseIf Zahl = 2 Then
                'Berg
                lim = R.Next(6) + 1
            ElseIf Zahl = 6 Then
                'See
                lim = R.Next(50) + 1
            Else
                lim = R.Next(10) + 1
            End If
            If Zahl = 6 Then
                BereichFüllen(Zahl, lim, True, R)
            Else
                BereichFüllen(Zahl, lim, True, R)
            End If
        Next
        'Jetzt werden ein paar Riffe plaziert
        Dim FelderZahl As Integer = Breite * Höhe
        'maximal ein prozent der Felder sollte Ein Riff sein.
        Dim Felderprozent As Integer = FelderZahl * 0.05#
        'Jetzt kommen ein paar Wälder hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain(1, R.Next(2) + 1, True, R, "EBENE")
        Next
        'Jetzt kommen ein paar Berge hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain(2, R.Next(2) + 1, True, R, "EBENE")
        Next


        'Wir berechnen wie viele Gebäude auf die Karte passen sollen.
        Felderprozent = FelderZahl * 0.1#
        'Jeder Spieler braucht 2 Gebäude eine Basis und ein HQ
        Dim MinGebäude As Integer = ((Spieler.Length - 1) * 2)
        If Felderprozent < MinGebäude Then
            Felderprozent = MinGebäude
        End If
        'Wir plazieren die Gebäude
        CreateGebäude(Felderprozent, Straßenkreis, R)
        'Wir plazieren die Strände
        PlaceStrände(R)
        'zu letzt werden die Riffe plaziert
        Felderprozent = FelderZahl * 0.05#
        'Riffe
        PlaceRiff(Felderprozent, R)
        'Jetzt müssen wir noch die Übergänge aktualiesieren.
        ÜbergängeAktualiesieren()
        Zentrieren()
        Return StartVektor
    End Function
    ''' <summary>
    ''' Erstellt eine Zufallskarte
    ''' </summary>
    ''' <param name="Breite"></param>
    ''' <param name="Höhe"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="Regeln"></param>
    ''' <remarks></remarks>
    Public Shared Function Zufallskarte(ByVal Breite As Integer, ByVal Höhe As Integer, ByVal Spieler() As ObjektSpieler, ByVal Regeln As ObjektRegeln, Optional ByVal Straßenkreis As Boolean = True, Optional ByVal StartVektor As Integer = -1) As Integer
        Objektverwalter.Spielfeld = New ObjektSpielfeld(Breite, Höhe, Spieler, Regeln)
        Dim R As Random
        If StartVektor < 0 Then
            StartVektor = Zufallszahl(0, Integer.MaxValue - 1)
            R = New Random(StartVektor)
        Else
            R = New Random(StartVektor)
        End If
        'wir erschaffen Areas von Landschaften
        Dim Max As Integer = Breite * Höhe * 2.5#
        For I = 0 To Max
            '0=Ebene 1=Wald 2=Berg 6=See  
            Dim Zahl As Integer = R.Next(100)
            If Zahl < 30 Then
                Zahl = 0
            ElseIf Zahl < 60 Then
                Zahl = 1
            ElseIf Zahl < 80 Then
                Zahl = 2
            ElseIf Zahl < 100 Then
                Zahl = R.Next(2)
            Else
                Zahl = R.Next(2)
            End If
            Dim lim As Integer = 100
            If Zahl = 10 Then
                'Stadt
                'lim = r.nextInt(2)+1;
                lim = 1
            ElseIf Zahl = 0 Then
                'Ebene
                lim = R.Next(40) + 1
            ElseIf Zahl = 1 Then
                'Wald
                lim = R.Next(3) + 1
            ElseIf Zahl = 2 Then
                'Berg
                lim = R.Next(6) + 1
            ElseIf Zahl = 6 Then
                'See
                lim = R.Next(50) + 1
            Else
                lim = R.Next(10) + 1
            End If
            If Zahl = 6 Then
                BereichFüllen(Zahl, lim, True, R)
            Else
                BereichFüllen(Zahl, lim, True, R)
            End If
        Next
        'Jetzt werden ein paar Riffe plaziert
        Dim FelderZahl As Integer = Breite * Höhe
        'maximal ein prozent der Felder sollte Ein Riff sein.
        Dim Felderprozent As Integer = FelderZahl * 0.05#
        'Jetzt kommen ein paar Wälder hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain(1, R.Next(2) + 1, True, R, "EBENE")
        Next
        'Jetzt kommen ein paar Berge hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain(2, R.Next(2) + 1, True, R, "EBENE")
        Next
        'Wir berechnen wie viele Gebäude auf die Karte passen sollen.
        Felderprozent = FelderZahl * 0.1#
        'Jeder Spieler braucht 2 Gebäude eine Basis und ein HQ
        Dim MinGebäude As Integer = ((Spieler.Length - 1) * 2)
        If Felderprozent < MinGebäude Then
            Felderprozent = MinGebäude
        End If
        'Wir plazieren die Gebäude
        CreateGebäude(Felderprozent, Straßenkreis, R, True)
        'Jetzt müssen wir noch die Übergänge aktualiesieren.
        ÜbergängeAktualiesieren()
        Zentrieren()
    End Function
    ''' <summary>
    ''' Plaziert einige Landschaften
    ''' </summary>
    ''' <param name="SEC"></param>
    ''' <param name="LIM"></param>
    ''' <param name="cont"></param>
    ''' <remarks></remarks>
    Private Shared Sub BereichFüllen(ByVal SEC As Integer, ByVal LIM As Integer, ByVal cont As Boolean, ByVal R As Random, Optional ByVal NurBeiUntergrund As String = "")
        'Plaziert eimal die Landschaft
        Dim FüllGrad As Integer = 0
        Dim r1 As Integer = r.Next(Objektverwalter.Spielfeld.Breite - 1)
        Dim r2 As Integer = r.Next(Objektverwalter.Spielfeld.Höhe - 1)
        FeldPlazieren(r1, r2, SEC)
        FüllGrad += 1
        'Füllt die Landschaft aus.
        Dim Spielbereich(Objektverwalter.Spielfeld.Breite - 1, Objektverwalter.Spielfeld.Höhe - 1) As Boolean
        For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                    Spielbereich(X1, Y1) = True
                End If
            Next
        Next
        Dim Landschaft As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(r1, r2, ObjektSpielfeld.Bodenschlacht)
        Dim X As Integer = r1
        Dim Y As Integer = r2
        While Not Landschaft Is Nothing
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X + 1, Y, SEC)
                    Else
                        FeldPlazieren(X + 1, Y, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X - 1, Y) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X - 1, Y, SEC)
                    Else
                        FeldPlazieren(X - 1, Y, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X, Y + 1) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y + 1, SEC)
                    Else
                        FeldPlazieren(X, Y + 1, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y - 1) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y - 1, SEC)
                    Else
                        FeldPlazieren(X, Y - 1, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            Spielbereich(X, Y) = True
            If FüllGrad > LIM Then Exit While
            Dim Found As Boolean = False
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If Spielbereich(X1, Y1) = False Then
                        If FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                            Landschaft = Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht)
                            X = X1
                            Y = Y1
                            Found = True
                            Exit For
                        End If
                    End If
                Next
                If Found = True Then Exit For
            Next
            If Found = False Then Exit While
        End While
        If cont = True Then
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID) <> SEC Then
                        If Objektverwalter.Spielfeld.OnMap(X1 + 1, Y1) = False Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            End If
                        ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1 + 1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Plaziert eine Landschaften nach dem Zufallsgenerator.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <remarks></remarks>
    Private Shared Sub FeldPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal ID As Integer)
        If ID >= 10 And ID <= 14 Or ID = 17 Then
            Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(Objektverwalter.LandschaftenBilder(0).ID, X, Y, Objektverwalter.Spielfeld)
            Select Case ID
                Case 10
                    Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude = ObjektLadeklasse.NewGebäude("STADT", 0, X, Y)

            End Select
        Else
            Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(Objektverwalter.LandschaftenBilder(ID).ID, X, Y, Objektverwalter.Spielfeld)
        End If
    End Sub
    Private Shared Function FindID(ByVal ID As String) As Integer
        For I = 0 To LandschaftenBilder.Length - 1
            If LandschaftenBilder(I).ID = ID Then
                Return I
            End If
        Next
        Return -1
    End Function
    ''' <summary>
    ''' Plaziert ein paar Riffe.
    ''' </summary>
    ''' <param name="RiffZahl"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceRiff(ByVal RiffZahl As Integer, ByVal R As Random)
        'Konstante Riff
        Dim Riff As Integer = 7
        Dim RiffMöglichkeit As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                    Dim Möglich As Integer = 0
                    Dim X1 As Integer = X
                    Dim Y1 As Integer = Y
                    For I = 0 To 7
                        Select Case I
                            Case 0
                                X1 -= 1
                                Y1 -= 1
                            Case 1
                                X1 += 1
                            Case 2
                                X1 += 1
                            Case 3
                                Y1 += 1
                            Case 4
                                Y1 += 1
                            Case 5
                                X1 -= 1
                            Case 6
                                X1 -= 1
                            Case 7
                                Y1 -= 1
                        End Select
                        If Objektverwalter.Spielfeld.OnMap(X1, Y1) = True Then
                            If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "SEE" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "STRAND" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "BRÜCKE" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "ZUGBRÜCKE" Then
                                Möglich += 1
                            End If
                        End If
                    Next
                    If Möglich = 8 Then
                        RiffMöglichkeit.Push(New Point(X, Y))
                    End If
                End If
            Next
        Next
        Dim Plaziert As Integer = 0
        For I = 0 To RiffZahl
            If Plaziert >= RiffMöglichkeit.Count Then Exit For
            If R.Next(50) < 35 Then
                Dim Ort As Integer = R.Next(RiffMöglichkeit.Count - 1)
                FeldPlazieren(RiffMöglichkeit(Ort).X, RiffMöglichkeit(Ort).Y, Riff)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Plaziert ein bestimmtes Terrain wenn der Untergrunf es zu lässt.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Terrain"></param>
    ''' <param name="Untergrund"></param>
    ''' <remarks></remarks>
    Private Shared Sub FeldPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Terrain As Integer, ByVal Untergrund As String)
        If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = Untergrund Then
            FeldPlazieren(X, Y, Terrain)
        End If
    End Sub
    ''' <summary>
    ''' Erschafft eine Area und sucht dabei ein Startfeld für die Area aus.
    ''' </summary>
    ''' <param name="SEC"></param>
    ''' <param name="LIM"></param>
    ''' <param name="Cont"></param>
    ''' <param name="Untergrund"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceAreaTerrain(ByVal SEC As Integer, ByVal LIM As Integer, ByVal Cont As Boolean, ByVal R As Random, Optional ByVal Untergrund As String = "EBENE")
        Dim Möglichkeit As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = Untergrund Then
                    Möglichkeit.Push(New Point(X, Y))
                End If
            Next
        Next
        Dim Ort As Point = Möglichkeit(R.Next(0, Möglichkeit.Count - 1))
        BereichFüllen(Ort.X, Ort.Y, SEC, LIM, Cont, Untergrund, R)
    End Sub
    ''' <summary>
    ''' Erschafft eine Area um ein bestimmtes Startfeld
    ''' </summary>
    ''' <param name="X3"></param>
    ''' <param name="Y3"></param>
    ''' <param name="SEC"></param>
    ''' <param name="LIM"></param>
    ''' <param name="Cont"></param>
    ''' <param name="NurBeiUntergrund"></param>
    ''' <remarks></remarks>
    Private Shared Sub BereichFüllen(ByVal X3 As Integer, ByVal Y3 As Integer, ByVal SEC As Integer, ByVal LIM As Integer, ByVal Cont As Boolean, ByVal NurBeiUntergrund As String, ByVal R As Random)
        'Plaziert eimal die Landschaft
        Dim FüllGrad As Integer = 0
        Dim r1 As Integer = X3
        Dim r2 As Integer = Y3
        FeldPlazieren(r1, r2, SEC)
        FüllGrad += 1
        'Füllt die Landschaft aus.
        Dim Spielbereich(Objektverwalter.Spielfeld.Breite - 1, Objektverwalter.Spielfeld.Höhe - 1) As Boolean
        For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                    Spielbereich(X1, Y1) = True
                End If
            Next
        Next
        Dim Landschaft As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(r1, r2, ObjektSpielfeld.Bodenschlacht)
        Dim X As Integer = r1
        Dim Y As Integer = r2
        While Not Landschaft Is Nothing
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X + 1, Y, SEC)
                    Else
                        FeldPlazieren(X + 1, Y, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X - 1, Y) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X - 1, Y, SEC)
                    Else
                        FeldPlazieren(X - 1, Y, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X, Y + 1) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y + 1, SEC)
                    Else
                        FeldPlazieren(X, Y + 1, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y - 1) Then
                If r.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y - 1, SEC)
                    Else
                        FeldPlazieren(X, Y - 1, SEC, NurBeiUntergrund)
                    End If
                    FüllGrad += 1
                    If FüllGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            Spielbereich(X, Y) = True
            If FüllGrad > LIM Then Exit While
            Dim Found As Boolean = False
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If Spielbereich(X1, Y1) = False Then
                        If FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                            Landschaft = Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht)
                            X = X1
                            Y = Y1
                            Found = True
                            Exit For
                        End If
                    End If
                Next
                If Found = True Then Exit For
            Next
            If Found = False Then Exit While
        End While
        If Cont = True Then
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID) <> SEC Then
                        If Objektverwalter.Spielfeld.OnMap(X1 + 1, Y1) = False Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            End If
                        ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1 + 1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, SEC)
                                    ElseIf FindID(Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID) = SEC Then
                                        FeldPlazieren(X, Y, SEC)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Erstellt die Gebäude unserer Zufallskarte und verbindet falls gewünscht die HQs mit einer Straße
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Sub CreateGebäude(ByVal AnzahlderGebäude As Integer, ByVal Straßenkreis As Boolean, ByVal R As Random, Optional ByVal KeineHäfen As Boolean = False)
        Dim MaximaleVersuche As Integer = 1000
        Dim Basen(Objektverwalter.Spielfeld.Spieler.Length - 2) As Point
        Dim MinmalAbstand As Integer = (Objektverwalter.Spielfeld.Breite + Objektverwalter.Spielfeld.Höhe) / (Basen.Length)
        For I = 0 To Basen.Length - 1
            Dim Ort As Point
            Dim Durchgänge As Integer = 0
            While True
                Durchgänge += 1
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
                If Durchgänge > 1000 Then
                    If ContainsFeld(Basen, Ort) = False Then
                        Exit While
                    End If
                End If
                For I2 = 0 To I
                    If Math.Abs(Basen(I2).X - Ort.X) + Math.Abs(Basen(I2).Y - Ort.Y) < MinmalAbstand Then
                        Continue While
                    End If
                Next
                Exit While
            End While
            Basen(I) = Ort
            PlaceGebäude(Ort.X, Ort.Y, "HQ", I + 1)
        Next
        AnzahlderGebäude -= Basen.Length
        'Jetzt bekommt jeder Spieler ersteinmal 1 Basis
        For I = 0 To Basen.Length - 1
            Dim X As Integer
            Dim Y As Integer
            Do
                X = R.Next(-2, 2) + Basen(I).X
                Y = R.Next(-2, 2) + Basen(I).Y
            Loop While OhneGebäude(X, Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebäude(X, Y, "BASIS", I + 1)
        Next
        AnzahlderGebäude -= Basen.Length
        'So viele Basen werden plaziert
        Dim BasenZahl As Integer = AnzahlderGebäude * 0.2#
        'Am Anfang soll jeder Spieler 4 Basen haben
        For I = 0 To 2
            If BasenZahl - Basen.Length >= 0 Then
                For I2 = 0 To Basen.Length - 1
                    PlaceBuildingRandomUmOrt(Basen(I2), "BASIS", 3, I2 + 1, R)
                Next
                BasenZahl -= Basen.Length
            Else
                Exit For
            End If
        Next
        For I = 1 To BasenZahl
            Dim Ort As Point
            Do
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
            Loop While OhneGebäude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebäude(Ort.X, Ort.Y, "BASIS", 0)
        Next
        BasenZahl = 0
        'So viele Flughäfen werden plaziert
        Dim FlughafenZahl As Integer = AnzahlderGebäude * 0.1#
        For I = 0 To 1
            If FlughafenZahl - Basen.Length >= 0 Then
                For I2 = 0 To Basen.Length - 1
                    PlaceBuildingRandomUmOrt(Basen(I2), "FLUGHAFEN", 3, I2 + 1, R)
                Next
                FlughafenZahl -= Basen.Length
            Else
                Exit For
            End If
        Next
        For I = 1 To FlughafenZahl
            Dim Ort As Point
            Do
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
            Loop While OhneGebäude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebäude(Ort.X, Ort.Y, "FLUGHAFEN", 0)
        Next
        FlughafenZahl = 0
        'So viele Städte werden plaziert
        Dim StadtZahl As Integer = AnzahlderGebäude * 0.6#
        BasenZahl = StadtZahl * 0.3#
        Dim Rest As Integer
        Dim Max As Integer = Math.DivRem(BasenZahl, Basen.Length, Rest)
        StadtZahl = StadtZahl - Max * Basen.Length + Rest
        Dim I3 As Integer = 0
        For I = 1 To Max
            For I2 = 0 To Basen.Length - 1
                If I3 < 3 Then
                    PlaceBuildingRandomUmOrt(Basen(I2), "STADT", 5, I2 + 1, R)
                Else
                    Dim Ort As Point
                    Do
                        Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
                    Loop While OhneGebäude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
                    PlaceGebäude(Ort.X, Ort.Y, "STADT", I2 + 1)
                End If
            Next
            I3 += 1
        Next
        For I = 1 To StadtZahl
            Dim Ort As Point
            Do
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
            Loop While OhneGebäude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebäude(Ort.X, Ort.Y, "STADT", 0)
        Next
        'So wir haben alle Gebäude plaziert
        'So jetzt erstellen wir noch einen Straßenkreis
        If Straßenkreis = True Then
            For I = 0 To Basen.Length - 1
                Dim Startpunkt As Point = Basen(I)
                Dim EndPunkt As New Point
                If I = Basen.Length - 1 Then
                    EndPunkt = Basen(0)
                Else
                    EndPunkt = Basen(I + 1)
                End If
                CreateStraße(Startpunkt, EndPunkt, R)
                AktuallisiereStraßen()
            Next
        End If
        'So viele Häfen werden plaziert
        Dim HafenZahl As Integer = AnzahlderGebäude * 0.1#
        'Und dort können sie plaziert werden
        Dim HafenMöglichkeiten As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If IsEinAngrenzendesFeld(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht) = True Then
                    If OhneGebäude(X, Y, ObjektSpielfeld.Bodenschlacht) = True Then
                        If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) <> "SEE" Then
                            HafenMöglichkeiten.Push(New Point(X, Y))
                        End If
                    End If
                End If
            Next
        Next
        If Not KeineHäfen Then
            'Jeder Spieler erhält maximal einen Hafen.
            If HafenZahl - Basen.Length >= 0 Then
                For I2 = 0 To Basen.Length - 1
                    Dim Ort As Point
                    Dim Stelle As Integer = -1
                    Dim Durchläufe As Integer = 0
                    If HafenMöglichkeiten.Count <= 0 Then
                        Do
                            Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
                            Durchläufe += 1
                        Loop While OhneGebäude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False And GetDistance(Basen(I2), Ort) > 10 Or Durchläufe < MaximaleVersuche
                    Else
                        Do
                            Stelle = R.Next(HafenMöglichkeiten.Count - 1)
                            Ort = HafenMöglichkeiten(Stelle)
                            Durchläufe += 1
                        Loop While GetDistance(Basen(I2), Ort) > 10 Or Durchläufe < MaximaleVersuche

                    End If
                    PlaceGebäude(Ort.X, Ort.Y, "WERFT", I2 + 1)
                    If HafenMöglichkeiten.Count > 0 Then
                        HafenMöglichkeiten = PopFeld(HafenMöglichkeiten, Stelle)
                    End If
                Next
                HafenZahl -= Basen.Length
            End If

            For I = 1 To HafenZahl
                Dim Ort As Point
                Dim Stelle As Integer = -1
                If HafenMöglichkeiten.Count <= 0 Then
                    Do
                        Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Höhe - 1))
                    Loop While OhneGebäude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
                Else
                    Stelle = R.Next(HafenMöglichkeiten.Count - 1)
                    Ort = HafenMöglichkeiten(Stelle)
                End If
                PlaceGebäude(Ort.X, Ort.Y, "WERFT", 0)
                If HafenMöglichkeiten.Count > 0 Then
                    HafenMöglichkeiten = PopFeld(HafenMöglichkeiten, Stelle)
                End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Plaziert ein Gebäude Zufällig um einen Ort herum so lange auf dem Feld kein Gebäude steht.
    ''' </summary>
    ''' <param name="Ort"></param>
    ''' <param name="GebäudeID"></param>
    ''' <param name="Radius"></param>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceBuildingRandomUmOrt(ByVal Ort As Point, ByVal GebäudeID As String, ByVal Radius As Integer, ByVal Spieler As Integer, ByVal R As Random)
        Dim X As Integer
        Dim Y As Integer
        Do
            X = R.Next(-Radius, Radius) + Ort.X
            Y = R.Next(-Radius, Radius) + Ort.Y
        Loop While OhneGebäude(X, Y, ObjektSpielfeld.Bodenschlacht) = False
        PlaceGebäude(X, Y, GebäudeID, Spieler)
    End Sub
    ''' <summary>
    ''' Plaziert ein Gebäude
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceGebäude(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Spieler As Integer)
        FeldPlazieren(X, Y, 0)
        Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude = ObjektLadeklasse.NewGebäude(ID, Spieler, X, Y)
    End Sub
    Private Shared Function ContainsFeld(ByVal Felder() As Point, ByVal P As Point)
        For Each P1 In Felder
            If P1.X = P.X And P1.Y = P.Y Then
                Return True
            End If
        Next
        Return False
    End Function
    Private Shared Function OhneGebäude(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer) As Boolean
        If Objektverwalter.Spielfeld.OnMap(X, Y) = True Then
            If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude Is Nothing Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Private Shared Function IsEinAngrenzendesFeld(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Schlacht As Integer) As Boolean
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Objektverwalter.Spielfeld.OnMap(X2, Y2) = True Then
                If Objektverwalter.Spielfeld.Landschaften(X2, Y2, Schlacht).getID = ID Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' Erstellt eine Straße zwischen 2 Punkten
    ''' </summary>
    ''' <param name="Start"></param>
    ''' <param name="Ende"></param>
    ''' <remarks></remarks>
    Private Shared Sub CreateStraße(ByVal Start As Point, ByVal Ende As Point, ByVal R As Random)
        'Ein paar Konstanten
        Dim Brücke As Integer = 4
        Dim Straße As Integer = 3
        Dim Zugbrücke As Integer = 20
        'Wir berechnen den Weg der Straße
        Dim WSS As New Wegsuchsystem(ObjektLadeklasse.NewEinheit("BOMBER", 0, Start.X, Start.Y, False), Start.X, Start.Y, 0, -1)
        If R.Next(0, 9) > 3 Then
            WSS.Ziel(Ende.X, Ende.Y, ObjektSpielfeld.Bodenschlacht, True, R, False)
        Else
            WSS.Ziel(Ende.X, Ende.Y, ObjektSpielfeld.Bodenschlacht, True, , False)
        End If
        For I = 0 To WSS.WegpunkteX.Length - 1
            'Wir plazieren die Straße
            If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I), ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                If I > 0 And I < WSS.WegpunkteX.Length - 1 Then
                    If WSS.WegpunkteX(I - 1) = WSS.WegpunkteX(I) And WSS.WegpunkteX(I) = WSS.WegpunkteX(I + 1) Then
                        If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I), WSS.WegpunkteY(I) - 1) = True Then
                            If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I) - 1, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I), WSS.WegpunkteY(I) + 1) = True Then
                                    If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I) + 1, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                        If GetLandschaftsID(WSS.WegpunkteX(I - 1), WSS.WegpunkteY(I - 1), ObjektSpielfeld.Bodenschlacht) = "BRÜCKE" And GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "SEE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "BRÜCKE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "ZUGBRÜCKE" Then
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Zugbrücke)
                                        Else
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                                        End If
                                    Else
                                        FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                                    End If
                                Else
                                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                                End If
                            Else
                                FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                            End If
                        Else
                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                        End If
                    ElseIf WSS.WegpunkteY(I - 1) = WSS.WegpunkteY(I) And WSS.WegpunkteY(I) = WSS.WegpunkteY(I + 1) Then
                        If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I) - 1, WSS.WegpunkteY(I)) = True Then
                            If GetLandschaftsID(WSS.WegpunkteX(I) - 1, WSS.WegpunkteY(I), ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I) + 1, WSS.WegpunkteY(I)) = True Then
                                    If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I) + 1, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                        If GetLandschaftsID(WSS.WegpunkteX(I - 1), WSS.WegpunkteY(I - 1), ObjektSpielfeld.Bodenschlacht) = "BRÜCKE" And GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "SEE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "BRÜCKE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "ZUGBRÜCKE" Then
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Zugbrücke)
                                        Else
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                                        End If
                                    Else
                                        FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                                    End If
                                Else
                                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                                End If
                            Else
                                FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                            End If
                        Else
                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                        End If
                    Else
                        FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                    End If
                Else
                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Brücke)
                End If
            Else
                If OhneGebäude(WSS.WegpunkteX(I), WSS.WegpunkteY(I), ObjektSpielfeld.Bodenschlacht) = True Then
                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Straße)
                End If
            End If
        Next
    End Sub
    Private Shared Function GetLandschaftsID(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer) As String
        Return Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).getID
    End Function
    Private Shared Sub AktuallisiereStraßen()
        Dim Brücke As Integer = 4
        Dim Straße As Integer = 3
        ÜbergängeAktualiesieren()
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "ZUGBRÜCKE" Then
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).BildID < 0 Then
                        FeldPlazieren(X, Y, Brücke)
                    End If
                End If
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "BRÜCKE" Then
                    If CountAngrenzendeLandschaften(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht) <= 1 Then
                        FeldPlazieren(X, Y, Straße)
                    End If
                End If
            Next
        Next
    End Sub
    Private Shared Function CountAngrenzendeLandschaften(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Schlacht As Integer) As Integer
        Dim Anzahl As Integer = 0
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Objektverwalter.Spielfeld.OnMap(X2, Y2) = True Then
                If Objektverwalter.Spielfeld.Landschaften(X2, Y2, Schlacht).getID = ID Then
                    Anzahl += 1
                End If
            End If
        Next
        Return Anzahl
    End Function
    Private Shared Sub PlaceStrände(ByVal Ran As Random)
        Dim Strand As Integer = 8
        Dim StrandMöglichkeiten As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                    'So das Feld ist See
                    Dim R As Integer = 4 - CountAngrenzendeLandschaften(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht)
                    R -= CountAngrenzendeLandschaften(X, Y, "BRÜCKE", ObjektSpielfeld.Bodenschlacht)
                    R -= CountAngrenzendeLandschaften(X, Y, "ZUGBRÜCKE", ObjektSpielfeld.Bodenschlacht)
                    If R > 0 Then
                        'Mindestens ein Angrenzendes Feld ist nicht See wir können einen Strand plazieren
                        StrandMöglichkeiten.Push(New Point(X, Y))
                    End If
                End If
            Next
        Next
        For I = 0 To StrandMöglichkeiten.Count - 1
            If Ran.Next(0, 40) < 15 Then
                FeldPlazieren(StrandMöglichkeiten(I).X, StrandMöglichkeiten(I).Y, Strand)
            End If
        Next
    End Sub
    Private Shared Function ExistFeld(ByVal Felder() As Point, ByVal P As Point) As Boolean
        For Each P2 In Felder
            If P2.X = P.X And P2.Y = P.Y Then
                Return True
            End If
        Next
        Return False
    End Function
    Private Shared Function PopFeld(ByRef Felder As Stack(Of Point), ByVal Ort As Integer)
        Dim F As New Stack(Of Point)
        For I = 0 To Felder.Count - 1
            If I <> Ort Then
                F.Push(Felder(I))
            End If
        Next
        Return F
    End Function
    Public Shared Function GetDistance(ByVal P1 As Point, ByVal P2 As Point) As Integer
        Return Math.Abs(P1.X - P2.X) + Math.Abs(P1.Y - P2.Y)
    End Function
    Public Shared Function GenerateZufallskarteLuftschlacht(ByVal Schlacht As ObjektSpielfeld) As ObjektSpielfeld
        Dim Schlacht2 As New ObjektSpielfeld(Schlacht.Breite, Schlacht.Höhe, Schlacht.Spieler, Schlacht.Regeln)
        Dim Wolkenfelder As Integer = Zufallszahl(Schlacht.Breite * Schlacht.Höhe * 8 / 100, Schlacht.Breite * Schlacht.Höhe * 12 / 100)
        For X = 0 To Schlacht.Breite - 1
            For Y = 0 To Schlacht.Höhe - 1
                Schlacht2.Landschaften(X, Y, 0) = Schlacht.Landschaften(X, Y, 0)
                Schlacht2.Einheiten(X, Y, 0) = Schlacht.Einheiten(X, Y, 0)
            Next
        Next
        For I = 0 To Wolkenfelder - 1
            Dim X As Integer = 0
            Dim Y As Integer = 0
            Do
                X = Zufallszahl(0, Schlacht2.Breite - 1)
                Y = Zufallszahl(0, Schlacht2.Höhe - 1)
            Loop While Schlacht2.Landschaften(X, Y, 1).getID = "WOLKEN"
            Schlacht2.Landschaften(X, Y, 1) = New ObjektLandschaft("WOLKEN", X, Y, Schlacht2, Nothing)
        Next
        Return Schlacht2
    End Function
#End Region
#Region "Zufallskarte V2"
    Public Enum Abweichungsarten
        Linear
        Exponentiell
        Keine
    End Enum
    Public Shared Function ZufallskarteV2(ByVal Breite As Integer, ByVal Höhe As Integer, ByVal Spieler() As ObjektSpieler, ByVal Regeln As ObjektRegeln, Optional ByVal Straßenkreis As Boolean = True, Optional ByVal StartVektor As Integer = -1) As Integer
        'VORBEREITUNGEN:
        Dim R As Random
        If StartVektor < 0 Then
            StartVektor = Zufallszahl(0, Integer.MaxValue - 1)
            R = New Random(StartVektor)
        Else
            R = New Random(StartVektor)
        End If
        'erstmal alles löschen, also in Ebene umwandeln
        Spielfeld = New ObjektSpielfeld(Breite, Höhe, Spieler, Regeln)
        Zentrieren()

        'LANDSCHAFT ERSCHAFFEN:        
        'Wälder plazieren
        For Wälder = 0 To (Breite * Höhe) / (7 * 5)
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Höhe - 1), 7, "WALD", 2, R)
        Next

        'Gebirgszüge errichten
        For Terrain = 0 To (Breite * Höhe) / (10 * 8)
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Höhe - 1), 10, "BERG", 2, R)
        Next

        'Mit Wasser fluten
        For Terrain = 0 To (Breite * Höhe) / (30 * 10)
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Höhe - 1), 30, "SEE", 1, R)
        Next
        For Terrain = 0 To (Breite * Höhe) / (7 * 50)
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Höhe - 1), 7, "SEE", 1, R)
        Next
        'Strände und Riffe plazieren
        PlaceStrände(R)
        PlaceRiffe(R)



        'MENSCHLICHE EINGRIFFE BERECHNEN:
        'HQs plazieren
        Dim Startpos(Spieler.Length - 1) As Point
        For Sp = 1 To Spieler.Length - 1
            Dim KO() As ObjektKO = {ObjektLadeklasse.NewKO("ANDY", Sp), Nothing}
            Spielfeld.Spieler(Sp).KOS = KO
            Do
                Startpos(Sp).X = R.Next(0, Breite - 1)
                Startpos(Sp).Y = R.Next(0, Höhe - 1)
                If Spielfeld.Landschaften(Startpos(Sp).X, Startpos(Sp).Y, 0).LandschaftsID = "EBENE" Or Spielfeld.Landschaften(Startpos(Sp).X, 2, 0).LandschaftsID = "WALD" Then
                    If getAnzahlBefahrbareFelder(Startpos(Sp).X, Startpos(Sp).Y, ObjektLadeklasse.NewEinheit("TTP", 1, Startpos(Sp).X, Startpos(Sp).Y, 10), 0) > 7 Then
                        'Gültige Startposition gefunden

                        Exit Do
                    End If
                End If
            Loop
        Next
        'Basen und andere Produktionsgebäude errichten

        'Städte bauen

        'neutrale Gebäude erschaffen
        Dim Felderprozent As Integer = Breite * Höhe * 0.1#
        'Straßennetz anlegen
        Dim MinGebäude As Integer = ((Spieler.Length - 1) * 2)
        If Felderprozent < MinGebäude Then
            Felderprozent = MinGebäude
        End If
        'Wir plazieren die Gebäude
        CreateGebäude(Felderprozent, Straßenkreis, R, True)

        'LUFTSCHLACHT:


        'SCHLUSSBERECHNUNGEN:
        'Die ganzen Übergänge Grafisch aktuallisieren. (Am besten auch bei Leertaste :))
        ÜbergängeAktualiesieren()
        Return StartVektor
    End Function
    Public Shared Sub GruppePlazieren(ByVal StartX As Integer, ByVal StartY As Integer, ByVal Anzahl As Integer, ByVal Landschaftstyp As String, ByVal RadiusAngrenzendeLandschaft As Integer, ByVal R As Random)
        GruppePlazieren(StartX, StartY, Anzahl, 0, Abweichungsarten.Keine, Landschaftstyp, RadiusAngrenzendeLandschaft, R)
    End Sub
    Public Shared Sub GruppePlazieren(ByVal StartX As Integer, ByVal StartY As Integer, ByVal Anzahl As Integer, ByVal AnzahlAbweichung As Integer, ByVal AnzahlAbweichungsart As Abweichungsarten, ByVal Landschaftstyp As String, ByVal RadiusAngrenzendeLandschaft As Integer, ByVal R As Random)
        Dim Punkte(99) As Point
        Dim PunkteMaxInd As Integer = 1
        Punkte(0) = New Point(StartX, StartY)

        While Anzahl > 0
            'Wir müssen noch landschaften plazieren
            Dim pInd As Integer = R.Next(0, PunkteMaxInd - 1)
            Landschaftplazieren(Punkte(pInd).X, Punkte(pInd).Y, Landschaftstyp)
            Anzahl -= 1

            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X + 1, Punkte(pInd).Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X - 1, Punkte(pInd).Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X, Punkte(pInd).Y + 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X, Punkte(pInd).Y - 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)

            Punkte(pInd) = Punkte(PunkteMaxInd - 1) 'Den Punkte, auf den wir gerade plaziert haben brauchen wir nicht mehr.
            PunkteMaxInd -= 1
            If PunkteMaxInd <= 0 Then
                Exit While 'Es scheint keine freien Felder mehr zu geben...
            End If
        End While

    End Sub
    Public Shared Sub addPunktLandschaft(ByRef punkte() As Point, ByRef PunkteMaxInd As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal Landschaftstyp As String, ByVal RadiusAngrenzendeLandschaft As Integer)
        If X < 0 Then Exit Sub
        If Y < 0 Then Exit Sub
        If X >= Spielfeld.Breite Then Exit Sub
        If Y >= Spielfeld.Höhe Then Exit Sub

        For i = 0 To PunkteMaxInd - 1
            If punkte(i).X = X Then
                If punkte(i).Y = Y Then Exit Sub 'Diesen Punkt gibt es schon.
            End If
        Next

        If Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).LandschaftsID = Landschaftstyp Then Exit Sub
        'Kann dieses Terrain hier plaziert werden?
        For Each B In LandschaftenBilder
            If B.ID = Landschaftstyp Then
                If B.BildID(X, Y, Spielfeld) = -1 Then Exit Sub
                Exit For
            End If
        Next

        'In den Array hinzufügen
        punkte(PunkteMaxInd) = New Point(X, Y)
        PunkteMaxInd += 1
        If PunkteMaxInd >= punkte.Length Then Array.Resize(punkte, punkte.Length + 100)

        If RadiusAngrenzendeLandschaft <= 0 Then Exit Sub
        addPunktLandschaft(punkte, PunkteMaxInd, X + 1, Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
        addPunktLandschaft(punkte, PunkteMaxInd, X - 1, Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
        addPunktLandschaft(punkte, PunkteMaxInd, X, Y + 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
        addPunktLandschaft(punkte, PunkteMaxInd, X, Y - 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
    End Sub
    Public Shared Sub LandschaftPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal TerrainID As String, Optional ByVal Prüfen As Boolean = False)
        If Prüfen Then

        End If
        Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(TerrainID, X, Y, Objektverwalter.Spielfeld)
    End Sub
    Public Shared Function getAnzahlBefahrbareFelder(ByVal X As Integer, ByVal Y As Integer, ByVal Einheit As ObjektEinheit, ByVal Schlacht As Integer) As Integer
        Dim WSS As New Wegsuchsystem(Einheit, X, Y, Schlacht, , , Wegsuchsystem.SuchartenEinheiten.AlleEinheitenIgnorieren)
        Dim erreichbareFelder As Integer = 0
        For iX = 0 To Spielfeld.Breite - 1
            For iY = 0 To Spielfeld.Höhe - 1
                If WSS.getBewegungspunktekosten(iX, iY, Schlacht) >= 0 Then
                    erreichbareFelder += 1
                    'Objektverwalter.Spielfeld.Einheiten(iX, iY, ObjektSpielfeld.Bodenschlacht) = ObjektLadeklasse.NewEinheit(Einheit.EinheitenID, 1, iX, iY, 100, False)
                End If
            Next
        Next
        Return erreichbareFelder
    End Function
    Private Shared Sub PlaceRiffe(ByVal Ran As Random)
        Dim Riff As Integer = 7
        Dim StrandMöglichkeiten As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                    'So das Feld ist See
                    Dim R As Integer = CountAngrenzendeLandschaften(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht)
                    R += CountAngrenzendeLandschaften(X, Y, "BRÜCKE", ObjektSpielfeld.Bodenschlacht)
                    R += CountAngrenzendeLandschaften(X, Y, "ZUGBRÜCKE", ObjektSpielfeld.Bodenschlacht)
                    If R = 4 Then
                        'Alle angrenzenden Felder sind gültig.
                        StrandMöglichkeiten.Push(New Point(X, Y))
                    End If
                End If
            Next
        Next
        For I = 0 To StrandMöglichkeiten.Count - 1
            If Ran.Next(0, 40) < 25 Then
                FeldPlazieren(StrandMöglichkeiten(I).X, StrandMöglichkeiten(I).Y, Riff)
            End If
        Next
    End Sub
#End Region
#Region "Karte Transformieren"
    Public Shared Sub HorizontalSpiegeln()
        Dim Menü As ObjektKarteneditormenü = Objektverwalter.Menü
        Dim Breite As Integer = Objektverwalter.Spielfeld.Breite * 2
        Dim Höhe As Integer = Objektverwalter.Spielfeld.Höhe
        Dim AlteBreite As Integer = Objektverwalter.Spielfeld.Breite
        Dim AlteHöhe As Integer = Objektverwalter.Spielfeld.Höhe
        'wir vergrößern die Karte
        Menü.Karteverändern(Breite, Höhe, Objektverwalter.Spielfeld.Spieler.Length - 1, )
        'wir spiegeln die Karte
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHöhe - 1
                    Dim X1 As Integer = Breite - X - 1
                    Dim Y1 As Integer = Y
                    Dim Terrain As String = Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID
                    Objektverwalter.Spielfeld.Landschaften(X1, Y1, I) = New ObjektLandschaft(Terrain, X1, Y1, Objektverwalter.Spielfeld, Nothing)
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If Not E Is Nothing Then
                        Objektverwalter.Spielfeld.Einheiten(X1, Y1, I) = ObjektLadeklasse.NewEinheit(E.EinheitenID, E.Spieler, X1, Y1, E.Leben, False)
                    End If
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHöhe - 1
                    Dim X1 As Integer = Breite - X - 1
                    Dim Y1 As Integer = Y
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.GetRealGebäudeID <> "VERWEIS" Then
                            If G.GetRealGebäudeID = "FESTUNG" Then
                                Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1 - 1, Y1, G.Feuerbereit)
                            ElseIf G.GetRealGebäudeID = "OMEGARAKETE" Then
                                Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1 - 1, Y1, G.Feuerbereit)
                            ElseIf G.GetRealGebäudeID = "FABRIK" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            End If
                        End If
                    End If
                Next
            Next
        Next
        ÜbergängeAktualiesieren()
    End Sub
    Public Shared Sub VertikalSpiegeln()
        Dim Menü As ObjektKarteneditormenü = Objektverwalter.Menü
        Dim Breite As Integer = Objektverwalter.Spielfeld.Breite
        Dim Höhe As Integer = Objektverwalter.Spielfeld.Höhe * 2
        Dim AlteBreite As Integer = Objektverwalter.Spielfeld.Breite
        Dim AlteHöhe As Integer = Objektverwalter.Spielfeld.Höhe
        'wir vergrößern die Karte
        Menü.Karteverändern(Breite, Höhe, Objektverwalter.Spielfeld.Spieler.Length - 1, )
        'wir spiegeln die Karte
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHöhe - 1
                    Dim X1 As Integer = X
                    Dim Y1 As Integer = Höhe - Y - 1
                    Dim Terrain As String = Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID
                    Objektverwalter.Spielfeld.Landschaften(X1, Y1, I) = New ObjektLandschaft(Terrain, X1, Y1, Objektverwalter.Spielfeld, Nothing)
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If Not E Is Nothing Then
                        Objektverwalter.Spielfeld.Einheiten(X1, Y1, I) = ObjektLadeklasse.NewEinheit(E.EinheitenID, E.Spieler, X1, Y1, E.Leben, False)
                    End If
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHöhe - 1
                    Dim X1 As Integer = X
                    Dim Y1 As Integer = Höhe - Y - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.GetRealGebäudeID <> "VERWEIS" Then
                            If G.GetRealGebäudeID = "FESTUNG" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                            ElseIf G.GetRealGebäudeID = "OMEGARAKETE" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                            ElseIf G.GetRealGebäudeID = "FABRIK" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 2, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 2, G.Feuerbereit)
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebäude = ObjektLadeklasse.NewGebäude(G.GebäudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            End If
                        End If
                    End If
                Next
            Next
        Next
        ÜbergängeAktualiesieren()
    End Sub
#End Region

    Public Shared Sub Autospeichern()
        If My.Settings.Autospeichern Then
            'Objektverwalter.AutospeichernFrames += 1
            'If Objektverwalter.AutospeichernFrames >= Objektverwalter.AutospeichernPeriode Then
            'Objektverwalter.AutospeichernFrames = 0
            If Not Hauptmenü.NetzConnected Then
                If Not Hauptmenü.AufzeichnungAbspielen Then
                    'If Objektverwalter.Spielfeld.EingabenErlauben Then
                    Hauptmenü.Speichern("Autospeichern" + Objektverwalter.AutospeicherIndex.ToString, ".sav")
                    Objektverwalter.AutospeicherIndex += 1
                    If Objektverwalter.AutospeicherIndex > 5 Then
                        Objektverwalter.AutospeicherIndex = 0
                    End If
                    'End If
                End If
            End If
            'End If
        End If
    End Sub
End Class
